tôi đã chơi một chút với giao diện có chữ ký xây dựng trong nguyên cảo, và tôi đã trở thành một chút bối rối khi những sản phẩm sau thất bại trong việc gõ kiểm tra:Giao diện với chữ ký xây dựng không gõ kiểm tra
class Foo {
constructor() {
}
}
interface Bar {
new(): Bar;
}
function Baz(C : Bar) {
return new C()
}
var o = Baz(Foo);
Lỗi loại được :
thông số Cung cấp không phù hợp với bất kỳ chữ ký của mục tiêu gọi: Xây dựng chữ ký của các loại 'mới() => Foo' và 'Bar' là không tương thích: loại 'Bar' đòi hỏi một chữ ký xây dựng, nhưng loại Thiếu 'Foo' s one (C: Bar) => Bar
Loại hàm tạo của Foo là() => Foo, và đó là điều tôi nghĩ Bar nói. Am i thiếu cái gì ở đây?
Thay vì sử dụng 'bất kỳ' bạn sử dụng giao diện siêu (bạn có thể bỏ qua' triển khai' và 'mở rộng', btw). Đó là alright, tôi đoán, và tốt hơn so với 'any', nhưng một điều vẫn còn lỗi tôi: Tại sao bạn không thể để cho' NewableBar :: new() 'trả về một' NewableBar'? Tại sao nó phải là một loại ** chung hơn ** so với 'NewableBar' (và rõ ràng ít nhất là chung chung là' Foo')? –
@AdrianLang Tôi đưa vào kế thừa và triển khai rõ ràng để rõ ràng, nhưng bạn đúng - TypeScript sẽ vui vẻ suy ra những điều đó nếu mọi thứ phù hợp. Có một vấn đề giải thích khi cố gắng xử lý chữ ký 'mới()' trên một phương thức như một kiểu cụ thể. – Fenton
Nhưng, điều này xảy ra bất cứ khi nào bạn cố thêm bất kỳ thứ gì vào Foo. Chỉnh sửa: xin lỗi, tôi đã làm sai. Chữ ký cấu trúc của tôi phải là: 'new (... _: any []): Bar; ' – farre