Нет, тип системы Машинопись не достаточно выразительным для этого - смотрите обсуждение в 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.
Великого объяснения, Благодарю. Отслеживание https://github.com/Microsoft/TypeScript/issues/4890. – trefeater
В https://github.com/therror/therror это достигается путем экспорта форм для возвращаемых классов mixin, и разработчик должен определить новую фигуру в коде https://github.com/therror/therror # машинопись-ограничение – trefeater