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
答案 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);
关于实例化泛型类型参数的值的问题,这是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 })
)