generics - TypeScript: kiểu trả về tự tham chiếu cho các phương thức trong các lớp kế thừa
Tuyên bố từ chối trách nhiệm: Tôi gặp khó khăn trong việc tóm tắt vấn đề trong tiêu đề của câu hỏi, vì vậy nếu bạn có gợi ý tốt hơn, xin vui lòng cho tôi biết trong phần bình luận.
Hãy xem lớp TypeScript đơn giản sau đây:
class Model {
save():Model {
// save the current instance and return it
}
}
Lớp Model có một phương thức save() trả về một thể hiện của chính nó: một Model.
Chúng ta có thể mở rộng Model như sau:
class SomeModel extends Model {
// inherits the save() method
}
Vì vậy, SomeModel sẽ kế thừa save(), nhưng nó vẫn trả về một Model, không phải SomeModel.
Có cách nào, có thể sử dụng generic, để đặt kiểu trả về của save() trong SomeModel thành SomeModel, mà không cần phải định nghĩa lại nó bên trong lớp kế thừa không?
Câu trả lời #1
Tôi biết tôi đến muộn cho bữa tiệc,
@2019 Tôi đã tìm ra cách để làm cho kiểu trả về cụ thể:
class Model {
save<T extends Model>(this: T): T {
// save the current instance and return it
}
}
Bằng cách này, bất cứ thứ gì mở rộng Model, hoặc chính Model, sẽ được tham chiếu như kiểu trả về khi được gọi.
Và với Typescript@3, điều này cũng hoạt động:
class Model {
save(): this {
// save the current instance and return it
}
}
Câu trả lời số 2
Bạn thật may mắn. Polymorphic này vừa xuất hiện trong TypeScript 1.7. Nâng cấp lên TypeScript 1.7 và sau đó bỏ kiểu trả về rõ ràng thì nó sẽ hoạt động hoàn hảo:
class Model {
save() {
return this;
}
}
class SomeModel extends Model {
otherMethod() {
}
}
let someModel = new SomeModel().save();
// no compile error since someModel is typed as SomeModel in TS 1.7+
someModel.otherMethod();
