Knockout - proper function inheritance

Main change was that you can define fn against a one of the observable
types (subscribable, observable, observableArray, computed) and have it
available in the appropriate types. Also made sure the knockoutjs test
file is actually passing.
This commit is contained in:
Felix Jorkowski
2012-10-31 12:08:58 +11:00
parent b1e1b8b79d
commit 712295f2b4
2 changed files with 824 additions and 731 deletions

View File

@@ -1,216 +1,268 @@
// Type definitions for Knockout 2.2
// Project: http://knockoutjs.com
// Definitions by: Boris Yankov <https://github.com/borisyankov/>
// Definitions: https://github.com/borisyankov/DefinitelyTyped
interface KnockoutSubscription {
dispose(): void;
}
interface KnockoutObservableArrayFunctions {
// General Array functions
indexOf(searchElement, fromIndex?: number): number;
slice(start: number, end?: number): any[];
splice(start: number): any[];
splice(start: number, deleteCount: number, ...items: any[]): any[];
pop();
push(...items: any[]): void;
shift();
unshift(...items: any[]): number;
reverse(): any[];
sort(): void;
sort(compareFunction): void;
subscribe(callback: (newValue: any[]) => void ): KnockoutSubscription;
// Ko specific
remove(item): any[];
removeAll(items: any[]): any[];
removeAll(): any[];
destroy(item): void;
destroyAll(items: any[]): void;
destroyAll(): void;
}
interface KnockoutObservableArray extends KnockoutObservableArrayFunctions {
fn: KnockoutObservableArrayFunctions;
(): KnockoutObservableArray;
(value: any[]): KnockoutObservableArray;
}
interface KnockoutObservableBase {
fn;
extend(source);
subscribe(func: Function): KnockoutSubscription;
}
interface KnockoutObservableAny extends KnockoutObservableBase {
(): any;
(value): void;
}
interface KnockoutObservableString extends KnockoutObservableBase {
(): string;
(value: string): void;
}
interface KnockoutObservableNumber extends KnockoutObservableBase {
(): number;
(value: number): void;
}
interface KnockoutObservableBool extends KnockoutObservableBase {
(): bool;
(value: bool): void;
}
interface KnockoutObservableDate extends KnockoutObservableBase {
(): Date;
(value: Date): void;
}
interface KnockoutComputed extends KnockoutObservableBase {
(): KnockoutComputed;
(func: Function, context?: any): KnockoutComputed;
(def: KnockoutComputedDefine): KnockoutComputed;
(options?: any): KnockoutComputed;
subscribe(callback: (newValue: number) => void ): KnockoutSubscription;
getDependenciesCount(): number;
hasWriteFunction(): bool;
}
interface KnockoutComputedDefine {
read(): any;
write(any);
}
interface KnockoutBindingContext {
$parent: any;
$parents: any[];
$root: any;
$data: any;
$index?: number;
$parentContext?: KnockoutBindingContext;
}
interface KnockoutBindingHandler {
// TODO: Work out how to define bindingHandlers when not using all the args
// adding element?: any, etc doesnt work...
init(element: any, valueAccessor: () => any, allBindingsAccessor: () => any, viewModel: any, bindingContext: KnockoutBindingContext): void;
update(element: any, valueAccessor: () => any, allBindingsAccessor: () => any, viewModel: any, bindingContext: KnockoutBindingContext): void;
//init: any;
//update: any;
options?: any;
}
interface KnockoutBindingHandlers {
value: KnockoutBindingHandler;
}
interface KnockoutMemoization {
memoize(callback);
unmemoize(memoId, callbackParams);
unmemoizeDomNodeAndDescendants(domNode, extraCallbackParamsArray);
parseMemoText(memoText);
}
interface KnockoutVirtualElements {
allowedBindings;
emptyNode;
firstChild;
insertAfter;
nextSibling;
prepend;
setDomNodeChildren;
}
interface KnockoutExtenders {
throttle(target: any, timeout: number): KnockoutComputed;
notify(target: any, notifyWhen: string): any;
}
interface KnockoutUtils {
fieldsIncludedWithJsonPost: any[];
arrayForEach(array: any[], action: (any) => void ): void;
arrayIndexOf(array: any[], item: any): number;
arrayFirst(array: any[], predicate: (item) => bool, predicateOwner?: any): any;
arrayRemoveItem(array: any[], itemToRemove: any): void;
arrayGetDistinctValues(array: any[]): any[];
arrayMap(array: any[], mapping: (item) => any): any[];
arrayFilter(array: any[], predicate: (item) => bool): any[];
arrayPushAll(array: any[], valuesToPush: any[]): any[];
extend(target, source);
emptyDomNode(domNode): void;
moveCleanedNodesToContainerElement(nodes: any[]): HTMLElement;
cloneNodes(nodesArray: any[], shouldCleanNodes: bool): any[];
setDomNodeChildren(domNode: any, childNodes: any[]): void;
replaceDomNodes(nodeToReplaceOrNodeArray: any, newNodesArray: any[]): void;
setOptionNodeSelectionState(optionNode: any, isSelected: bool): void;
stringTrim(str: string): string;
stringTokenize(str: string, delimiter: string): string;
stringStartsWith(str: string, startsWith: string): string;
domNodeIsContainedBy(node: any, containedByNode: any): bool;
domNodeIsAttachedToDocument(node: any): bool;
tagNameLower(element: any): string;
registerEventHandler(element: any, eventType: any, handler: Function): void;
triggerEvent(element: any, eventType: any): void;
unwrapObservable(value: any): any;
toggleDomNodeCssClass(node: any, className: string, shouldHaveClass: bool): void;
setTextContent(element: any, textContent: string): void;
setElementName(element: any, name: string): void;
ensureSelectElementIsRenderedCorrectly(selectElement);
forceRefresh(node: any): void;
ensureSelectElementIsRenderedCorrectly(selectElement: any): void;
range(min: any, max: any): any;
makeArray(arrayLikeObject: any): any[];
getFormFields(form: any, fieldName: string): any[];
parseJson(jsonString: string): any;
stringifyJson(data: any, replacer: Function, space: string): string;
postJson(urlOrForm: any, data: any, options: any): void;
domNodeDisposal;
}
interface KnockoutStatic {
utils: KnockoutUtils;
memoization: KnockoutMemoization;
bindingHandlers: KnockoutBindingHandlers;
computed: KnockoutComputed;
observableArray: KnockoutObservableArray;
virtualElements: KnockoutVirtualElements;
extenders: KnockoutExtenders;
applyBindings(viewModel: any, rootNode?: any): void;
applyBindingsToDescendants(viewModel: any, rootNode: any): void;
observable(value: string): KnockoutObservableString;
observable(value: Date): KnockoutObservableDate;
observable(value: number): KnockoutObservableNumber;
observable(value: bool): KnockoutObservableBool;
observable(value?: any): KnockoutObservableAny;
contextFor(node: any): any;
isSubscribable(instance: any): bool;
subscribable(): void;
toJSON(viewModel: any, replacer?: Function, space?: any): string;
toJS(viewModel: any): any;
isObservable(instance: any): bool;
dataFor(node: any): any;
}
// Type definitions for Knockout 2.2
// Project: http://knockoutjs.com
// Definitions by: Boris Yankov <https://github.com/borisyankov/>
// Definitions: https://github.com/borisyankov/DefinitelyTyped
interface KnockoutSubscribableFunctions {
extend(source);
subscribe(callback: (newValue: any[]) => void, target?:any, topic?: string): KnockoutSubscription;
notifySubscribers(valueToWrite, topic?: string);
dispose(): void;
}
interface KnockoutComputedFunctions extends KnockoutSubscribableFunctions {
getDependenciesCount(): number;
hasWriteFunction(): bool;
}
interface KnockoutObservableFunctions extends KnockoutSubscribableFunctions {
}
interface KnockoutObservableArrayFunctions extends KnockoutObservableFunctions {
// General Array functions
indexOf(searchElement, fromIndex?: number): number;
slice(start: number, end?: number): any[];
splice(start: number): any[];
splice(start: number, deleteCount: number, ...items: any[]): any[];
pop();
push(...items: any[]): void;
shift();
unshift(...items: any[]): number;
reverse(): any[];
sort(): void;
sort(compareFunction): void;
// Ko specific
remove(item): any[];
removeAll(items: any[]): any[];
removeAll(): any[];
destroy(item): void;
destroyAll(items: any[]): void;
destroyAll(): void;
}
interface KnockoutSubscribableStatic {
fn: KnockoutSubscribableFunctions;
new (): KnockoutSubscription;
}
interface KnockoutSubscription extends KnockoutSubscribableFunctions {
}
interface KnockoutComputedStatic {
fn: KnockoutComputedFunctions;
(): KnockoutComputed;
(func: Function, context?: any): KnockoutComputed;
(def: KnockoutComputedDefine): KnockoutComputed;
(options?: any): KnockoutComputed;
}
interface KnockoutComputed extends KnockoutComputedFunctions {
(): any;
(value: any): void;
}
interface KnockoutObservableArrayStatic {
fn: KnockoutObservableArrayFunctions;
(): KnockoutObservableArray;
(value: any[]): KnockoutObservableArray;
}
interface KnockoutObservableArray extends KnockoutObservableArrayFunctions {
(): any[];
(value: any[]): void;
}
interface KnockoutObservableStatic {
fn: KnockoutObservableFunctions;
(value: string): KnockoutObservableString;
(value: Date): KnockoutObservableDate;
(value: number): KnockoutObservableNumber;
(value: bool): KnockoutObservableBool;
(value?: any): KnockoutObservableAny;
}
interface KnockoutObservableBase extends KnockoutObservableFunctions {
}
interface KnockoutObservableAny extends KnockoutObservableBase {
(): any;
(value): void;
}
interface KnockoutObservableString extends KnockoutObservableBase {
(): string;
(value: string): void;
}
interface KnockoutObservableNumber extends KnockoutObservableBase {
(): number;
(value: number): void;
}
interface KnockoutObservableBool extends KnockoutObservableBase {
(): bool;
(value: bool): void;
}
interface KnockoutObservableDate extends KnockoutObservableBase {
(): Date;
(value: Date): void;
}
interface KnockoutComputedDefine {
read(): any;
write(any);
}
interface KnockoutBindingContext {
$parent: any;
$parents: any[];
$root: any;
$data: any;
$index?: number;
$parentContext?: KnockoutBindingContext;
extend(any): any;
createChildContext(any): any;
}
interface KnockoutBindingHandler {
init?(element: any, valueAccessor: () => any, allBindingsAccessor: () => any, viewModel: any, bindingContext: KnockoutBindingContext): void;
update?(element: any, valueAccessor: () => any, allBindingsAccessor: () => any, viewModel: any, bindingContext: KnockoutBindingContext): void;
options?: any;
}
interface KnockoutBindingHandlers {
// Controlling text and appearance
visible: KnockoutBindingHandler;
text: KnockoutBindingHandler;
html: KnockoutBindingHandler;
css: KnockoutBindingHandler;
style: KnockoutBindingHandler;
attr: KnockoutBindingHandler;
// Control Flow
foreach: KnockoutBindingHandler;
if: KnockoutBindingHandler;
ifnot: KnockoutBindingHandler;
with: KnockoutBindingHandler;
// Working with form fields
click: KnockoutBindingHandler;
event: KnockoutBindingHandler;
submit: KnockoutBindingHandler;
enable: KnockoutBindingHandler;
disable: KnockoutBindingHandler;
value: KnockoutBindingHandler;
hasfocus: KnockoutBindingHandler;
checked: KnockoutBindingHandler;
options: KnockoutBindingHandler;
selectedOptions: KnockoutBindingHandler;
uniqueName: KnockoutBindingHandler;
// Rendering templates
template: KnockoutBindingHandler;
}
interface KnockoutMemoization {
memoize(callback);
unmemoize(memoId, callbackParams);
unmemoizeDomNodeAndDescendants(domNode, extraCallbackParamsArray);
parseMemoText(memoText);
}
interface KnockoutVirtualElements {
allowedBindings;
emptyNode;
firstChild;
insertAfter;
nextSibling;
prepend;
setDomNodeChildren;
}
interface KnockoutExtenders {
throttle(target: any, timeout: number): KnockoutComputed;
notify(target: any, notifyWhen: string): any;
}
interface KnockoutUtils {
fieldsIncludedWithJsonPost: any[];
arrayForEach(array: any[], action: (any) => void ): void;
arrayIndexOf(array: any[], item: any): number;
arrayFirst(array: any[], predicate: (item) => bool, predicateOwner?: any): any;
arrayRemoveItem(array: any[], itemToRemove: any): void;
arrayGetDistinctValues(array: any[]): any[];
arrayMap(array: any[], mapping: (item) => any): any[];
arrayFilter(array: any[], predicate: (item) => bool): any[];
arrayPushAll(array: any[], valuesToPush: any[]): any[];
extend(target, source);
emptyDomNode(domNode): void;
moveCleanedNodesToContainerElement(nodes: any[]): HTMLElement;
cloneNodes(nodesArray: any[], shouldCleanNodes: bool): any[];
setDomNodeChildren(domNode: any, childNodes: any[]): void;
replaceDomNodes(nodeToReplaceOrNodeArray: any, newNodesArray: any[]): void;
setOptionNodeSelectionState(optionNode: any, isSelected: bool): void;
stringTrim(str: string): string;
stringTokenize(str: string, delimiter: string): string;
stringStartsWith(str: string, startsWith: string): string;
domNodeIsContainedBy(node: any, containedByNode: any): bool;
domNodeIsAttachedToDocument(node: any): bool;
tagNameLower(element: any): string;
registerEventHandler(element: any, eventType: any, handler: Function): void;
triggerEvent(element: any, eventType: any): void;
unwrapObservable(value: any): any;
toggleDomNodeCssClass(node: any, className: string, shouldHaveClass: bool): void;
setTextContent(element: any, textContent: string): void;
setElementName(element: any, name: string): void;
ensureSelectElementIsRenderedCorrectly(selectElement);
forceRefresh(node: any): void;
ensureSelectElementIsRenderedCorrectly(selectElement: any): void;
range(min: any, max: any): any;
makeArray(arrayLikeObject: any): any[];
getFormFields(form: any, fieldName: string): any[];
parseJson(jsonString: string): any;
stringifyJson(data: any, replacer: Function, space: string): string;
postJson(urlOrForm: any, data: any, options: any): void;
domNodeDisposal;
}
interface KnockoutStatic {
utils: KnockoutUtils;
memoization: KnockoutMemoization;
bindingHandlers: KnockoutBindingHandlers;
virtualElements: KnockoutVirtualElements;
extenders: KnockoutExtenders;
applyBindings(viewModel: any, rootNode?: any): void;
applyBindingsToDescendants(viewModel: any, rootNode: any): void;
subscribable: KnockoutSubscribableStatic;
observable: KnockoutObservableStatic;
computed: KnockoutComputedStatic;
observableArray: KnockoutObservableArrayStatic;
contextFor(node: any): any;
isSubscribable(instance: any): bool;
toJSON(viewModel: any, replacer?: Function, space?: any): string;
toJS(viewModel: any): any;
isObservable(instance: any): bool;
dataFor(node: any): any;
}
declare var ko: KnockoutStatic;

File diff suppressed because it is too large Load Diff