בנאי - איך להשתמש במחלקות אנונימיות ב-TypeScript


אני מנסה ליצור פונקציית עזר, כדי להוסיף קרייה, כדי ליצור הגדרות נפוצות עבור מחלקות. לדוגמה:

class Person {
    private name: string;
    private sex: string;

    constructor (name: string, sex: string) {
        this.name = name;
        this.sex = sex;
    }
}

var newPersonSex = function (sex: string) {
    return function (name: string) {
        return new Person(name, sex);
    }
}

var MalePerson = newPersonSex('male'); 
var FemalePerson = newPersonSex('female'); 

כך שכעת כאשר נוצרים אובייקטים של MalePerson ו-FemalePerson, זה בעצם מחזיר במקום זאת מופע חדש של Person.

var m = new MalePerson( 'john' );

כדי שמערכת הטיפוס תאפשר לי עדיין להשתמש ב-'new', MalePerson צריך להיות סוג קונסטרקטור. לדוגמה: 'new (name:string) => Person'. זה גם צריך להיות סוג ההחזרה של הפונקציה.

עם זאת, עם ההצהרות הללו שנוספו, אני לא יכול להחזיר פונקציה מתוך 'newPersonSex'. לדוגמה, זה לא חוקי:

var newPersonSex = function (sex: string) : new(name:string) => Person {
    return function (name: string) {
        return new Person(name, sex);
    }
}

איך אני יכול ליצור ולהחזיר פונקציית בנאי או מחלקה חדשה באופן מיידי?

תשובה #1

נסה את ההגדרה הזו של newPersonSex:

var newPersonSex = function (sex: string) {
    return <new (name: string) => Person> <any> function (name: string) {
        return new Person(name, sex);
    }
}

הבעיה בקוד שלך היא שלפונקציות יש רק חתימות קריאה, ולא חתימות בנייה. הדוגמה שלי למעלה עוברת על זה על ידי התחלה בהצהרה שסוג הפונקציה הזה הוא any, ואז הצהרה שסוג ה-any הוא למעשה בונה.

שימו לב שהסוג של newPersonSex ייקבע מהסוג שמוחזר שלו, כך שאין צורך להוסיף הערת פונקציה.