如何在TypeScript接口中引用同接口内其他属性的类型?
实现TypeScript接口内属性类型的自动推断(非显式泛型方案)
需求说明
需要定义一个类型,满足以下要求:
o1属性必须继承ObjectWithA类型o2属性的类型为o1属性的键类型- 无需显式指定泛型参数,由TypeScript自动推断类型
原始无效写法
type ObjectWithA = { a: number }; interface SomeObject { o1: ObjectWithA; o2: keyof this.o1; // 此写法在接口定义中无效 }
不希望使用的显式泛型写法
// 无需手动指定泛型参数,因此不采用该写法 interface SomeObject<T extends ObjectWithA> { o1: T; o2: keyof T; }
期望的使用效果
const obj = { a: 2, b: "string" }; const someObject: SomeObject = { o1: obj, o2: "a" // 合法 }; const someObject: SomeObject = { o1: obj, o2: "b" // 合法 }; const someObject: SomeObject = { o1: obj, o2: "c" // 报错 };
解决方案:泛型类型别名 + satisfies关键字
底层基于泛型实现,但无需显式指定泛型参数,TypeScript会自动完成类型推断,完全符合预期使用方式:
type ObjectWithA = { a: number }; // 定义带默认参数的泛型类型别名 type SomeObjectShape<T extends ObjectWithA = ObjectWithA> = { o1: T; o2: keyof T; }; const obj = { a: 2, b: "string" }; // 合法:o2匹配obj的键类型 const validObj1 = { o1: obj, o2: "a" } satisfies SomeObjectShape; // 合法:o2匹配obj的键类型 const validObj2 = { o1: obj, o2: "b" } satisfies SomeObjectShape; // 报错:"c"不属于obj的键类型 const invalidObj = { o1: obj, o2: "c" } satisfies SomeObjectShape;
补充说明
satisfies关键字(TypeScript 4.9及以上版本支持)既会约束对象符合SomeObjectShape的类型规则,又会保留对象的具体类型信息,让TypeScript自动推断o2的合法取值范围。- 全程无需手动指定泛型参数,完全实现“自动推断”的需求。
内容的提问来源于stack exchange,提问作者ertucode
相关产品推荐
相关产品推荐

