Typescript: 导出所有出现在公有API中的类型

578 阅读1分钟

在使用Typescript足够长时间后,你终会发现自己想使用第三方模块的type或者interface,却发现其没有被导出。幸运的是,Typescript的类型之间的映射工具足够丰富;作为一个库用户,你几乎总能找到一种方法来引用你想要的类型;作为一个库作者,这意味着你应该在一开始就导出你的类型。如果一个类型出现在函数声明中,它就被有效地导出。

假设你想创建一些秘密的、未导出的类型:

interface SecretName {
    firstName: string;
    lastName: string;
}

interface SecretSanta {
    name: SecretName;
    gift: string;
}

export function getGift(name: SecretName, gift: string): SecretSanta {
    // ...
}

你的模块的用户不能直接导入SecretName或SecretSanta,而只能导入getGift。但这并不是障碍;因为只要这些类型出现在导出的函数签名中,就可以提取它们。一种方法是使用Parameters和ReturnType泛型类型:

type MySanta = ReturnType<typeof getGift>;  // SecretSanta
type MyName = Parameters<typeof getGift>[0];  // SecretName

如果你不导出这些类型的目的是保持灵活性,那就比较麻烦。把它们放在一个公有API中,意味着你已经交出它们了。为了让用户能方便的使用库,最好导出它们。

注意:

导出任何公有方法中以任何形式出现的类型。你的用户无论如何都能提取它们,所以不妨让这件事变得更容易一些,直接导出这些类型