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

TypeScript中如何引用派生类型并实现属性类型匹配校验?

解决TypeScript中接口B的类型关联校验问题

现有接口A定义如下:

interface A {
  boolProp: boolean,
  stringProp: string,
  numberProp: number,
  // 其他属性/方法...
}

需求是定义接口B,要求prop为A的属性名,default的类型必须与prop指定的A属性类型严格匹配,不匹配时TypeScript能抛出错误。比如下面的代码中,default赋值true与prop指定的stringProp(string类型)不匹配,需要触发TS错误:

const b: B = {
  prop: 'stringProp',
  default: true, // 期望此处触发TS错误:boolean无法赋值给string
};

解决方案

使用泛型接口绑定prop和default的类型关联,具体实现如下:

interface A {
  boolProp: boolean,
  stringProp: string,
  numberProp: number,
  // 其他属性/方法...
}

// 泛型接口B,泛型K约束为A的属性名
interface B<K extends keyof A = keyof A> {
  prop: K;
  default: A[K];
  // 其他属性/方法...
}

验证示例

  • 正确赋值(无TS错误):
// 匹配boolProp的boolean类型
const b1: B<'boolProp'> = {
  prop: 'boolProp',
  default: false
};

// 匹配stringProp的string类型
const b2: B<'stringProp'> = {
  prop: 'stringProp',
  default: 'hello'
};
  • 错误赋值(触发TS报错):
// 错误:boolean类型无法赋值给string类型
const b3: B<'stringProp'> = {
  prop: 'stringProp',
  default: true
};

进阶优化:自动推导泛型参数

如果不想显式指定泛型参数,可通过泛型函数让TypeScript自动推导类型:

function createB<K extends keyof A>(config: { prop: K; default: A[K] }): B<K> {
  return config as B<K>;
}

// 自动推导类型,错误赋值直接触发报错
const b4 = createB({
  prop: 'numberProp',
  default: '123' // 错误:string无法赋值给number
});

内容的提问来源于stack exchange,提问作者Luckylooke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:30:54