如何为TypeScript未导出的函数参数类型创建可复用类型定义
如何捕获未导出的函数参数类型并复用?
当然有更简洁的办法!TypeScript自带的类型工具就能完美解决这个问题,不用写那种冗余的辅助函数。
方法一:直接提取参数类型
你可以用TypeScript内置的Parameters<T>类型工具,它能把函数类型T的参数提取成一个元组,然后通过索引取出你需要的参数类型。针对你的场景,直接提取bar方法的第二个参数类型即可:
// 模拟库代码(不可修改) interface Internal { foo(): number } class A { bar(s: string, x: Internal): string { return s + x.foo(); } } export const Exported = A; // 你的代码 let e = new Exported(); // 提取bar方法的第二个参数类型 let x: Parameters<typeof e.bar>[1]; // 现在x的类型就是未导出的Internal,类型检查完全生效 x = { foo: () => 42 }; // 符合类型要求 e.bar("any ideas?", x); // 类型匹配,不会报错
方法二:给类型起别名复用
如果需要多次使用这个未导出的类型,可以给它起一个别名,方便后续复用:
// 先提取类型并命名 type InternalType = Parameters<typeof e.bar>[1]; // 之后就可以直接用这个别名定义变量了 let x: InternalType; let anotherX: InternalType; // 重复使用毫无压力
为什么这个方法可行?
TypeScript的类型系统可以访问值的类型信息,哪怕对应的接口没有被导出,只要函数参数用到了这个类型,我们就能通过Parameters这类工具“捕获”到它的类型定义。相比你之前写的泛型辅助函数,这种方式完全是类型层面的操作,不会生成任何冗余的JS代码,简洁又高效。
内容的提问来源于stack exchange,提问作者Motti
相关产品推荐
相关产品推荐

