从可选构造函数参数的返回类型推断类型

时间:2020-08-27 11:43:30

标签: typescript type-inference

trace = FALSE

我希望从type DefaultType = {.....}; class A<MyInferedType> { constructor( private readonly paramFunc: (response: MyInferedType) => any, private readonly optionalParamFunc?: () => Promise<MyInferedType> ) {} async doSomething() { // note the else branch! if optionalParamFunc is not defined i want to use a DefaultType value const result = this.optionalParamFunc ? this.optionalParamFunc() : {} as DefaultType ; this.paramFunc(result); } } 推断出MyInferedType,如果它传递给构造函数。如果没有通过,我希望它是optionalParamFunc。 我在玩infer关键字,但没有成功。我猜有些专家可以向我解释什么是正确的方法。

我应该能够按以下方式使用它:

DefaultType

playground link

1 个答案:

答案 0 :(得分:1)

您实际上并不需要条件类型的推断行为(即infer关键字)。一个简单的参数类型default似乎可以完成这项工作:

type DefaultType = { d: string };
class A<MyInferedType = DefaultType> {
  constructor(
    private readonly paramFunc: (response: MyInferedType) => any,
    private readonly optionalParamFunc?: () => Promise<MyInferedType>
  ) {}
}

type AnyTypeOfChoice  = {a: string }
const defVal: DefaultType = { d: ""};
const inferedVal: AnyTypeOfChoice = { a: ""};
const a = new A((defVal) => { defVal.d });
const a2 = new A((inferedVal) => { inferedVal.a }, async () => inferedVal);

Playground Link

关于实例化泛型类型参数的值的问题,这是TS原则上不允许的。从类型的角度来看,检查this.optionalParamFunc和类型参数MyInferedType之间没有关系,因此就ts而言,您无法实例化MyInferedType,因为您真的不知道完全是什么样子。

您可以使用类型断言来解决此问题:

const result = this.optionalParamFunc ? await this.optionalParamFunc() : {d: "asdsad"} as any as MyInferedType;

请注意,我们可以设想一个实例,该实例实际上具有未定义的this.optionalParamFunc,而没有类型参数DefaultType。 (new A<AnyTypeOfChoice>((inferedVal) => { inferedVal.a })