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