说我有这个:
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'
}
所以默认字段的类型取决于类型字段的值/类型 .
Succintly ,如果 foo
是 'ArrayOfBoolean'
,那么 default
应该是: Array<boolean>
. 如果 foo
是 'Number'
,则默认值应为 number
,如果foo为 'Boolean'
,则默认值应为 boolean
等 .
2 回答
您可以在Catalyst的答案中定义
ElemType
,然后使用映射类型将ElemType
的并集用于所有可能的K
:你必须告诉typescript以某种方式验证实际的obj,如果不使用泛型,你就无法逃脱;我就是这样做的: