在Typescript 2.4+中使用'this'自我类型和泛型函数的问题

时间:2018-03-24 00:05:42

标签: typescript generics inheritance

我有SELECT * FROM your_table WHERE NOT REGEXP_LIKE( your_column, '[^,0-9]' ); ,其中包含BaseModel等CRUD方法。商业模式可以从BaseModel扩展,只需免费使用save及其朋友。

我已声明.save()的返回类型为save,所以当Promise<this>的实例自身调用RandomModel时,返回类型非常好{{} 1}}而不是模糊save,而不是自我类型的目的。

问题是当我尝试在有特殊需求的模型中覆盖Promise<RandomModel>时。 Promise<BaseModel>使用相同的签名重新实现save,而不是依次调用继承的方法,仍然必须返回SpecialNeedsModel

问题在于save使用的内部辅助函数。它不会进行类型检查,坚持帮助器的类型参数Promise<this>不满足save的约束。

此代码适用于Typescript 2.3及更早版本,并且被覆盖的this的返回类型是派生的承诺,正如预期的那样。但编译器开关BaseModel不会使错误消失。

我是否只是遗漏了一些东西,比如可能意外地重新宣布了一种新的自我类型?

save

更新:它似乎与helperFn的返回值有关。如果我没有在SpecialNeeds.save()中返回helperFn的值,并且我删除了helperFn上的显式--noStrictGenericChecks或将其更改为function helperFn<T extends BaseModel>(model: T, args?: Object): Promise<T> { console.log("do stuff with", model, args); return Promise.resolve(model); } export class BaseModel { save(): Promise<this> { return helperFn<this>(this); } } export class RandomModel extends BaseModel { } var Rmodel = new RandomModel(); Rmodel.save().then(_ => console.log("RandomModel saved")); export class SpecialNeedsModel extends BaseModel { save(): Promise<this> { return helperFn<this>(this, { m: "create" }); // ERROR on <this> } } var SNmodel = new SpecialNeedsModel(); SNmodel.save().then(_ => console.log("SpecialNeedsModel saved")); ,则不会给出编译器错误。最后需要明确的<this>

我理解协方差/逆变被翻转为返回值与参数,但在自我类型上我不明白为什么它会成为一个问题。对于自我类型,我希望即使有不变性也能工作。

0 个答案:

没有答案