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