如何创建无需显式指定类型参数的TypeScript同参双方法对象类型?
如何定义TypeScript对象类型,让两个函数参数类型自动保持一致
我们可以通过泛型类型+辅助函数的方式实现,无需手动指定参数类型,TypeScript会自动推导并检查foo和bar的参数类型是否匹配:
解决方案代码
// 泛型类型:约束foo和bar使用相同的参数类型数组 type TestObj<T extends any[]> = { foo: (...args: T) => void; bar: (...args: T) => void; }; // 辅助函数:自动推导泛型参数,无需手动指定 function createTestObj<T extends any[]>(obj: TestObj<T>): TestObj<T> { return obj; }
合法使用示例
// 场景1:foo和bar参数类型完全一致 const test = createTestObj({ foo: (a: string) => { console.log('foo'); }, bar: (b: string) => { console.log('bar'); } }); // 场景2:bar接受的参数是foo参数的前缀(符合函数参数逆变规则,允许省略后续参数) const test2 = createTestObj({ foo: (a: string, b: number) => { console.log('foo'); }, bar: (b: string) => { console.log('bar'); } });
不合法场景(TypeScript自动报错)
// 错误:bar的参数类型与foo不匹配 const test3 = createTestObj({ foo: (a: string) => { console.log('foo'); }, bar: (b: number) => { console.log('bar'); } });
原理说明
TestObj<T>通过泛型T约束了foo和bar必须使用相同的参数类型数组。- 辅助函数
createTestObj会自动从传入的对象字面量中推导T的具体类型(即foo的参数类型),然后自动校验bar是否符合该参数类型要求。 - 整个过程无需手动指定泛型参数,完全由TypeScript自动完成类型推导和错误检查。
内容的提问来源于stack exchange,提问作者Geoff Rich
相关产品推荐
相关产品推荐

