Nie, system typu Maszynopis nie jest na tyle wyrazisty, że za - patrz dyskusja w https://github.com/Microsoft/TypeScript/issues/7225 i https://github.com/Microsoft/TypeScript/issues/4890.
idiomatyczne „typ zajęć” w maszynopisie jest napisane jak
interface Constructor<T> {
new (...args): T;
}
więc jeden sposób, aby napisać oświadczenie dla Compose jest
export declare class Simple {}
export declare class Super extends Simple {
static Compose<T>(Base?: Constructor<T>): Constructor<T & {/*mixed-in declarations*/}>
}
Oznacza to, że Skomponuj typ zwracany jest uznany za konstruktor dla typu przecięcia - typ, który musi mieć wszystkie właściwości parametru (Base) wraz ze wszystkimi właściwościami mixin.
Możesz użyć tej deklaracji (zakładając, że w pliku library.d.ts) jak to
import {Super} from './library'
let MyComposed = Super.Compose(Super)
let myInstance = new MyComposed
małoletniego niedogodności jest to, że zawsze trzeba dostarczyć argumentu dla Super.Compose(), ponieważ typ wnioskowania nie działa bez znajomości wartości dla parametru domyślnego i nie można podać wartości dla parametru domyślnego w pliku deklaracji.
Jednak dużym problemem jest to, że naprawdę nie można użyć wyniku Compose jako klasa:
class MyClass extends Super.Compose(Super) {}
nie skompilować z powodu wyżej wymienionych zagadnień:
error TS2509: Base constructor return type 'Super & {}' is not a class or interface type.
Wielkiej wyjaśnienia dzięki. Śledzenie https://github.com/Microsoft/TypeScript/issues/4890 teraz. – trefeater
W https://github.com/therror/therror osiąga się to przez eksportowanie kształtów dla zwróconych klas mixin, a programista musi zdefiniować nowy kształt w kodzie https://github.com/therror/therror # ograniczenia maszynopisu – trefeater