Grałem trochę z interfejsami z podpisami konstruktem w maszynopisie, i stałem się nieco zdezorientowany, gdy nie następuje typ kontroli:Interfejsy z podpisami konstruktem nie wpisać sprawdzanie
class Foo {
constructor() {
}
}
interface Bar {
new(): Bar;
}
function Baz(C : Bar) {
return new C()
}
var o = Baz(Foo);
Błąd typ :
podanych parametrów nie znaleziono żadnych podpis docelowego połączenia: Construct podpisy 'new() => Foo' Rodzaje i 'Bar' są niezgodne: typ 'Bar' wymaga podpisu zbudować, ale Type Brak "Foo" s one (C: Bar) => Bar
Typ konstruktora Foo to() => Foo, i to jest to, co myślałem, że Bar powiedział. Czy coś mi umyka?
Zamiast używać "dowolnego", używasz super interfejsu (możesz pominąć 'implements' i' extends', btw). Zgadza się, wszystko w porządku i jest lepsze od "jakiegokolwiek", ale jedna rzecz nadal mnie nurtuje: dlaczego nie możesz pozwolić 'NewableBar :: new()' zwrócić 'NewableBar'? Dlaczego musi to być typ bardziej ogólny ** niż 'NewableBar' (i oczywiście przynajmniej tak ogólny jak' Foo')? –
@AdrianLang Dodałem jawne dziedziczenie i implementacje, aby były jawne, ale masz rację - TypeScript z radością wnioskuje, jeśli wszystko pasuje. Występuje problem z interpretacją, gdy próbujemy traktować sygnaturę 'new()' dla metody jako określonego typu. – Fenton
Ale to zepsuje się, gdy spróbujesz dodać coś do Foo. Edycja: przepraszam, robiłem to źle. Mój podpis konstrukcji powinien brzmieć: 'new (... _: any []): Bar;' – farre