2016-09-10 20 views
5

Có cách nào để viết định nghĩa Typescript cho một số ES6 mix-in không?Định nghĩa kiểu số cho các hỗn hợp ES6

tôi đã mô hình này trong library.js, và tôi muốn tạo ra library.d.ts

// declaration in `library.js` 
class Super extends Simple { 
    constructor() {} 

    static Compose(Base = Super) { 
     return class extends Base { 
      // ...  
     } 

    } 
} 

// usage in `client.js` 
class MyClass extends Super.Compose() {} 
let myInstance = new MyClass(); 

class MyOtherClass extends Super.Compose(AnotherClass) {} 

Trả lời

4

Không, hệ thống kiểu nguyên cảo là không đủ biểu cảm cho điều đó - xem các cuộc thảo luận trong https://github.com/Microsoft/TypeScript/issues/7225https://github.com/Microsoft/TypeScript/issues/4890.

Các thành ngữ 'loại của các tầng lớp trong nguyên cảo được viết như

interface Constructor<T> { 
    new (...args): T; 
} 

Vì vậy, một cách để viết lời tuyên bố cho Soạn là

export declare class Simple {} 

export declare class Super extends Simple { 
    static Compose<T>(Base?: Constructor<T>): Constructor<T & {/*mixed-in declarations*/}> 
} 

Đó là, Soạn kiểu trả về được tuyên bố là một constructor cho kiểu giao nhau - một kiểu phải có tất cả các thuộc tính của tham số (Base) cùng với tất cả các thuộc tính của mixin.

Bạn có thể sử dụng khai đó (giả định đó là trong file library.d.ts) như

import {Super} from './library' 

let MyComposed = Super.Compose(Super) 
let myInstance = new MyComposed 

Sự bất tiện nhỏ này là bạn luôn luôn phải cung cấp luận cứ cho Super.Compose() vì suy luận kiểu không hoạt động mà không biết giá trị cho tham số mặc định và bạn không thể cung cấp giá trị cho tham số mặc định trong tệp khai báo.

Nhưng vấn đề lớn là bạn có thể không thực sự sử dụng kết quả của Soạn như là một lớp:

class MyClass extends Super.Compose(Super) {} 

không biên dịch do các vấn đề nêu trên:

error TS2509: Base constructor return type 'Super & {}' is not a class or interface type. 
+0

lớn giải thích, cảm ơn. Theo dõi https://github.com/Microsoft/TypeScript/issues/4890 ngay bây giờ. – trefeater

+0

Trong https://github.com/therror/therror, điều này đạt được bằng cách xuất các hình dạng cho các lớp mixin trả về và nhà phát triển phải xác định hình dạng mới trong mã https://github.com/therror/therror # typescript-limits – trefeater

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