我正在开发graphql模式化程序,由于下一个条件类型不起作用,我无法继续
type VarType = 'Boolean' | 'Float' | 'Id' | 'Int' | 'String';
type TypeValue<Type extends VarType> =
Type extends 'Boolean' ? boolean :
Type extends ('Float' | 'Int') ? number :
Type extends ('Id' | 'String') ? string :
never
;
type TypeValueDeclaration<Type extends (VarType | [VarType])> = Type extends [VarType]
? Array<TypeValue<Type[0]>>
: TypeValue<Type> // Type 'Type' does not satisfy the constraint
;
我该如何使类型为TypeValueDeclaration
它将像这样使用
interface FieldInfo<Type extends (VarType | [VarType])> {
type: Type,
resolver: () => TypeValueDeclaration<Type>;
}
function addInfo<Type extends (VarType | [VarType])>(info: FieldInfo<Type>) {
console.log(info);
}
addInfo({
type: 'Int',
resolver: () => 3.14,
});
addInfo({
type: 'Int',
resolver: () => '10', // compilation error :+1
});
addInfo({
type: ['Int'],
resolver: () => [1, 2, 3],
});
addInfo({
type: ['Int'],
resolver: () => ['lol'], // compilation error :+1
});
答案 0 :(得分:0)
您可以通过阐明每种可能性来解决条件类型中的编译错误:
type TypeValueDeclaration<Type extends (VarType | [VarType])> = Type extends [VarType]
? Array<TypeValue<Type[0]>>
: Type extends VarType ? TypeValue<Type> : never
;
您可能会认为编译器应该了解Type extends VarType
那时必须为true,但必须为unfortunately it does not, at least for now。
还要注意,从字符串文字到类型的映射时不必使用条件类型,因为普通对象类型可以做到这一点:
type TypeValue<Type extends VarType> = {
Boolean: boolean, Float: number, Int: number, Id: string, String: string
}[Type];
但这取决于您。
哦,希望能有所帮助;祝你好运!