TypeScript - اینترفیسها با امضاهای سازنده بررسی نوع انجام نمیدهند
من کمی با اینترفیسهایی که امضاهای سازنده در TypeScript دارند بازی کردهام، و کمی گیج شدم وقتی که عبارت زیر از نظر نوع بررسی نشد:
class Foo {
constructor () {
}
}
interface Bar {
new(): Bar;
}
function Baz(C : Bar) {
return new C()
}
var o = Baz(Foo);
خطای نوع عبارت است از:
پارامترهای ارائه شده با هیچ امضای هدف فراخوانی مطابقت ندارند: امضاهای سازنده انواع 'new() => Foo' و 'Bar' ناسازگار هستند: نوع 'Bar' نیاز به یک امضای سازنده دارد، اما نوع 'Foo' چنین امضایی ندارد (C: Bar) => Bar
نوع سازندهٔ Foo عبارت است از() => Foo، و این همان چیزی است که من فکر میکردم Bar گفته است. آیا چیزی را اینجا از دست دادهام؟
پاسخ شماره ۱
در اینجا نسخه بهروزشدهای از کد شما با تغییر ظریف ارائه شده است.
ما رابط Bar را با هر توابع و متغیرهایی که انتظار داریم موجود باشند تعریف میکنیم.
سپس، ما رابط Bar را با رابط NewableBar گسترش میدهیم. این فقط یک سازنده تعریف میکند که یک Bar را برمیگرداند.
زیرا Foo Bar را پیادهسازی میکند و یک سازنده دارد و Baz به NewableBar نیاز دارد، همه چیز بررسی میشود.
این کمی طولانیتر از any است - اما بررسیای که میخواهید را به شما میدهد.
interface Bar {
}
interface NewableBar extends Bar {
new();
}
class Foo implements Bar {
constructor () {
}
}
function Baz(C : NewableBar) {
return new C()
}
var o = Baz(Foo);
پاسخ شماره ۲
مشکل (حداقل از دید کامپایلر TypeScript) امضای متد new در Bar است. اگر تعریف Bar را با مورد زیر جایگزین کنید،
interface Bar {
new (): any;
}
کار میکند. بهتر است از new(): Foo استفاده کنید، فقط Bar به عنوان مقدار بازگشتی کار نمیکند.
