You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:00:56