2016-09-10 2 views
5

Есть ли способ написать определение машинописного текста для ES6 mix-in?Определение машинописных имен для ES6 mixins

Я эту картину в library.js, и я хотел бы создать 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) {} 

ответ

4

Нет, тип системы Машинопись не достаточно выразительным для этого - смотрите обсуждение в https://github.com/Microsoft/TypeScript/issues/7225 и https://github.com/Microsoft/TypeScript/issues/4890.

идиоматическое «тип классов» в машинописи записывается как

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

Так один из способов, чтобы написать заявление на Compose является

export declare class Simple {} 

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

То есть, Compose возврат тип объявлен конструктор для типа пересечения - тип, который должен иметь все свойства параметра (Base) вместе со всеми свойствами mixin.

Вы можете использовать эту декларацию (если это в файле library.d.ts) как этот

import {Super} from './library' 

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

минорного неудобство в том, что вы всегда должны предоставить аргументы в пользу Super.Compose(), потому что умозаключения типа не работает, не зная значения параметра по умолчанию, и вы не можете указать значение параметра по умолчанию в файле декларации.

Но большая проблема в том, что вы не можете использовать результат Compose как класс:

class MyClass extends Super.Compose(Super) {} 

не компилируется из-за проблем, упомянутых выше:

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

Великого объяснения, Благодарю. Отслеживание https://github.com/Microsoft/TypeScript/issues/4890. – trefeater

+0

В https://github.com/therror/therror это достигается путем экспорта форм для возвращаемых классов mixin, и разработчик должен определить новую фигуру в коде https://github.com/therror/therror # машинопись-ограничение – trefeater

Смежные вопросы