Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有TypeScript的条件类型_Typescript_Tsc_Typescript3.0 - Fatal编程技术网

带有TypeScript的条件类型

带有TypeScript的条件类型,typescript,tsc,typescript3.0,Typescript,Tsc,Typescript3.0,假设我有这个: type TypeMapping = { Boolean: boolean, String: string, Number: number, ArrayOfString: Array<string>, ArrayOfBoolean: Array<boolean> } export interface ElemType { foo: keyof TypeMapping, default: valueof TypeMapping

假设我有这个:

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

export interface ElemType {
  foo: keyof TypeMapping,
  default: valueof TypeMapping
}
但这似乎不太正确,有人知道正确的方法吗

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

{
  foo: 'String',
  default: 'this is a string'
}
但这不是:

{
  foo: 'Boolean',
  default: 'this should be a boolean instead'
}
因此,默认字段的类型取决于类型字段的值/类型


简洁地说,如果
foo
'ArrayOfBoolean'
,那么
默认值
应该是:
数组
。如果
foo
'Number'
,那么默认值应该是
Number
,如果foo是
'Boolean'
,那么默认值应该是
Boolean
,等等。

你必须告诉typescript以某种方式验证实际的obj,如果不使用泛型,你就无法真正逃脱;我会这样做:

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

export interface ElemType<K extends keyof TypeMapping> {
  foo: K;
  default: TypeMapping[K];
}

const Elem = <E extends keyof TypeMapping, T extends ElemType<E>>(t: ElemType<E>) => t;

Elem({ foo: "Boolean", default: true }); //yup
Elem({ foo: "Boolean", default: "" }); //nope
类型类型映射={
布尔型:布尔型;
字符串:字符串;
编号:编号;
ArrayOfString:数组;
};
导出接口元素类型{
傅:K,;
默认值:TypeMapping[K];
}
常量元素=(t:ElemType)=>t;
元素({foo:“Boolean”,默认值:true})//是的
元素({foo:“Boolean”,默认值:})//不

您可以在Catalyst的回答中定义
ElemType
,然后使用映射类型为所有可能的
K
ElemType
的并集:

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} | ...
接口元素类型{
傅:K,;
默认值:TypeMapping[K];
}
类型ElemTypeMap={[K in keyof TypeMapping]:ElemType};
//类型ElemTypeMap={
//布尔:{foo:“Boolean”,默认值:Boolean},
//字符串:{foo:“String”,默认值:String},
//   ...
// }
键入SomeElemType=ElemTypeMap[keyof TypeMapping];
//按所有键在ElemTypeMap中查找并获取联合:
//{foo:“Boolean”,默认值:Boolean}|{foo:“String”,默认值:String}|。。。

可能与我更新的OP重复,问题似乎不同,或者至少该问题的答案不充分不确定最后一行在做什么-不确定访问器部分-您有一个标准界面
{}
,但随后访问
{}[]
这是一个问题。当
[]
中的类型是多个键的并集时,它将生成这些键的值类型的并集。请参阅更新的答案。如果还不清楚,请告诉我。
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} | ...