TypeScript: آیا ممکن است یک کلاس تعریف کرد که یک نمونه از یک تابع بسازد؟


در TypeScript آیا امکان دارد که یک کلاس سازندهٔ یک نمونهٔ تابع باشد؟ من چیزی شبیه به این را تصور میکنم:

class SomeThing {
    (name: string) {
       // do something with name
    }
}

let thing = new SomeThing();
thing('John Doe');

پاسخ شماره ۱

از نظر فنی ممکن است (این نیاز به چند ترفند دارد که من اینجا نمینویسم) اما واقعاً نمیخواهید این کار را انجام دهید؛ دلیلش این است.

عملگر new یک شیء جدید (نه تابع) ایجاد میکند که __proto__ آن، prototype عملوند است. این بدان معنی است که شما به هیچ وجه نمیتوانید چیزی قابل فراخوانی دریافت کنید که توسط عملگر new برگردانده شود، مگر اینکه صریحاً چیز دیگری از سازنده برگردانید.

اما اگر چیزی دیگر از سازنده بازگردانید، آنگاه thing instanceof SomeThing برابر با false خواهد بود و شما قادر نخواهید بود از متدهای prototype کلاس روی thing استفاده کنید. بنابراین در آن نقطه، دیگر واقعاً مانند یک class رفتار نمیکند و بهتر است فقط یک function کارخانه داشته باشید که میتواند هر چیزی که میخواهد انجام دهد.