在使用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中,意味着你已经交出它们了。为了让用户能方便的使用库,最好导出它们。
注意:
导出任何公有方法中以任何形式出现的类型。你的用户无论如何都能提取它们,所以不妨让这件事变得更容易一些,直接导出这些类型