Ale*_*lls 4 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
}
Run Code Online (Sandbox Code Playgroud)
而不是any默认使用,我想有条件地定义它,我试过这个:
export interface ElemType<T extends TypeMapping> {
foo: keyof T,
default: T
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不太正确,有没有人知道这样做的正确方法?
如果不清楚,对于任何具有ElemType类型的给定对象,foo指向的键必须与foo指向的值匹配.例如,这是有效的:
{
foo: 'String',
default: 'this is a string'
}
Run Code Online (Sandbox Code Playgroud)
但这不是:
{
foo: 'Boolean',
default: 'this should be a boolean instead'
}
Run Code Online (Sandbox Code Playgroud)
所以默认字段的类型是有条件的值/类型的类型的字段.
Succintly,如果foo是'ArrayOfBoolean'的话default应该是:Array<boolean>.如果foo是'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} | ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
306 次 |
| 最近记录: |