打字稿:条件类型不起作用

时间:2019-12-17 20:58:28

标签: typescript

我正在开发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
});

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];

但这取决于您。


哦,希望能有所帮助;祝你好运!

Link to code