如何让TypeScript接口中两参数类型一致且无需泛型输入?
TypeScript 接口类型约束问题解决方案
你希望MyInterface中的a和b是同一MyType子类型,但不想显式传递泛型参数。TypeScript本身不支持"存在类型"(即不指定具体泛型参数但约束其关系),但可以通过以下两种方式实现需求:
方案1:泛型类型别名 + 自动推断
将MyInterface定义为泛型类型别名,声明符合该类型的对象时,TypeScript会自动推断出T的具体类型,无需显式指定:
interface MyType { x: string; y: number; } // 泛型类型别名,约束T继承MyType type MyInterface<T extends MyType = MyType> = { a: T; b: T[]; }; // 示例子类型 interface MySubType extends MyType { z: boolean; } // 使用时无需显式指定泛型,TS自动推断T为MySubType const validObj: MyInterface = { a: { x: "foo", y: 123, z: true }, b: [{ x: "bar", y: 456, z: false }] }; // 错误示例:a和b类型不匹配会触发TS报错 const invalidObj: MyInterface = { a: { x: "foo", y: 123 }, b: [{ x: "bar", y: 456, z: false }] };
方案2:工厂函数自动推断类型
如果更倾向于使用接口而非类型别名,可以通过工厂函数创建实例,函数会自动推断泛型参数,无需手动传入:
interface MyType { x: string; y: number; } interface MyInterface<T extends MyType> { a: T; b: T[]; } // 工厂函数,自动推断T的类型 function createMyInterface<T extends MyType>(obj: MyInterface<T>): MyInterface<T> { return obj; } // 示例子类型 interface MySubType extends MyType { z: boolean; } // 使用时直接传入对象,TS自动推断T为MySubType const obj = createMyInterface({ a: { x: "foo", y: 123, z: true }, b: [{ x: "bar", y: 456, z: false }] });
说明
TypeScript没有原生支持"隐式泛型约束"的接口写法(即你想要的interface MyInterface { a: T; b: T[] }),因为T需要被明确约束为MyType的子类型,而接口无法在内部隐式声明这样的泛型变量。上述两种方案可以在不手动指定泛型参数的前提下,保证a和b为同一MyType子类型。
内容的提问来源于stack exchange,提问作者Ólavur Nón
相关产品推荐
相关产品推荐

