使用 TypeScript 的条件类型

2023-12-14

假设我有这个:

type TypeMapping = {
  Boolean: boolean,
  String: string,
  Number: number,
  ArrayOfString: Array<string>,
  ArrayOfBoolean: Array<boolean>
}

export interface ElemType {
  foo: keyof TypeMapping,
  default: valueof TypeMapping
}

而不是使用any对于默认情况,我想有条件地定义它,我尝试了以下方法:

export interface ElemType<T extends TypeMapping> {
  foo: keyof T,
  default: T
}

但这似乎不太正确,有谁知道正确的方法吗?

如果不清楚,对于任何具有 ElemType 类型的给定对象, foo 指向的键必须与 foo 指向的值匹配。例如,这是有效的:

{
  foo: 'String',
  default: 'this is a string'
}

但这不是:

{
  foo: 'Boolean',
  default: 'this should be a boolean instead'
}

所以默认字段的类型是有条件的关于类型字段的值/类型。

简洁地, if foo is 'ArrayOfBoolean', then default应该:Array<boolean>. If foo is 'Number',那么默认应该是number,如果 foo 是'Boolean'那么默认应该是boolean等等等等


您可以定义ElemType就像 Catalyst 的答案一样,然后使用映射类型来取并集ElemType为了所有可能的K:

interface ElemType<K extends keyof TypeMapping> {
  foo: K;
  default: TypeMapping[K];
}
type ElemTypeMap = {[K in keyof TypeMapping]: ElemType<K>};
// type ElemTypeMap = {
//   Boolean: {foo: "Boolean", default: boolean},
//   String: {foo: "String", default: string},
//   ...
// }
type SomeElemType = ElemTypeMap[keyof TypeMapping];
// Look up in ElemTypeMap by all keys and take the union:
// {foo: "Boolean", default: boolean} | {foo: "String", default: string} | ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 TypeScript 的条件类型 的相关文章