Saya membuat antarmuka kecil ini untuk mendapatkan tipe statis untuk Knockout:
interface ObservableNumber {
(newValue: number): void;
(): number;
subscribe: (callback: (newValue: number) => void) => void;
}
interface ObservableString {
(newValue: string): void;
(): string;
subscribe: (callback: (newValue: string) => void) => void;
}
interface ObservableBool {
(newValue: bool): void;
(): bool;
subscribe: (callback: (newValue: bool) => void) => void;
}
interface ObservableAny {
(newValue: any): void;
(): any;
subscribe: (callback: (newValue: any) => void) => void;
}
interface ObservableStringArray {
(newValue: string[]): void;
(): string[];
remove: (value: String) => void;
removeAll: () => void;
push: (value: string) => void;
indexOf: (value: string) => number;
}
interface ObservableAnyArray {
(newValue: any[]): void;
(): any[];
remove: (value: any) => void;
removeAll: () => void;
push: (value: any) => void;
}
interface Computed {
(): any;
}
interface Knockout {
observable: {
(value: number): ObservableNumber;
(value: string): ObservableString;
(value: bool): ObservableBool;
(value: any): ObservableAny;
};
observableArray: {
(value: string[]): ObservableStringArray;
(value: any[]): ObservableAnyArray;
};
computed: {
(func: () => any): Computed;
};
}
Taruh di "Knockout.d.ts" dan kemudian referensikan dari file Anda sendiri. Seperti yang Anda lihat, ini akan sangat diuntungkan dari obat generik (yang datang sesuai dengan spesifikasi).
Saya hanya membuat beberapa antarmuka untuk ko.observable (), tetapi ko.computed () dan ko.observableArray () dapat dengan mudah ditambahkan dalam pola yang sama. Pembaruan: Saya memperbaiki tanda tangan untuk subscribe () dan menambahkan contoh computed () dan observableArray ().
Untuk menggunakan dari file Anda sendiri, tambahkan ini di bagian atas:
declare var ko: Knockout;