2012-10-12 17 views
7

Tôi đang cố gắng tạo ra một hàm trợ giúp, để thêm currying, để tạo ra các thiết lập chung cho các lớp. Ví dụ:Làm thế nào để ẩn danh các lớp học trong 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'); 

Vì vậy, bây giờ khi đối tượng MalePerson và FemalePerson được tạo, nó thực sự chỉ trả về một cá thể mới của Người thay thế.

var m = new MalePerson('john'); 

Để hệ thống kiểu cho phép tôi vẫn sử dụng 'mới', MalePerson cần phải là kiểu trình tạo. Ví dụ: 'new (name: string) => Person'. Điều đó cũng cần phải là kiểu trả về của hàm.

Tuy nhiên với những tuyên bố được thêm vào, tôi không thể trả về một hàm từ bên trong 'newPersonSex'. Ví dụ: điều này không hợp lệ:

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

Làm cách nào để tạo và trả về hàm khởi tạo mới hoặc lớp đang chạy?

Trả lời

2

Hãy thử định nghĩa này của newPersonSex:

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

Vấn đề với mã của bạn là chức năng chỉ có chữ ký cuộc gọi, không xây dựng chữ ký. Ví dụ của tôi ở trên làm việc xung quanh điều này bằng cách đầu tiên khẳng định rằng loại hàm đó là bất kỳ, và sau đó khẳng định rằng bất kỳ loại nào thực sự là một hàm tạo.

Lưu ý rằng loại mớiPersonSex sẽ được suy ra từ loại trả về của nó, do đó không cần phải thêm chú thích hàm.

Các vấn đề liên quan