带有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} | ...