TypeScript interface 属性类型对应 有没有优雅的写法

有类型为

interface Other{
 num : number
}
interface A{
 name:'asd'|'qwe'|'pp'
 ack : Other|undefined|string[]
 ta  : undefined|Other
}

A 类型实际代码中是以 name 属性为标准,而像 ack,ta 属性的类型是根据 name 而变化的

即当 name'asd' 时 的对象,
即当 name'qwe' 时 的对象,
即当 name'pp' 时 的对象,
这三者的对象的属性都相同,但 ack,ta 类型会有一些不一样

有没有更优雅的写法以减少写类型判断

阅读 1.5k
1 个回答

如果属性的类型会随name变化的话,可以考虑把对象按name分成几类,然后在判断name,typescript会自动类型收缩推断出正确的类型


interface Other {
  num: number;
}

interface ASD {
  name: "asd";
  ack: Other;
  ta: undefined;
}
interface QWE {
  name: "qwe";
  ack: undefined;
  ta: undefined | Other;
}
interface PP {
  name: "pp";
  ack: string[];
  ta: undefined | Other;
}

type A = ASD | QWE | PP;

const a = null as A;

if (a.name === "asd") {
 //ASD类型
  a.ack;
} else if (a.name === "qwe") {
  //QWE类型
  a.ack;
} else {
  //PP类型
  a.ack;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进