diff --git a/knockout/knockout.d.ts b/knockout/knockout.d.ts
index 5aa7c61cbf..60c81d281e 100644
--- a/knockout/knockout.d.ts
+++ b/knockout/knockout.d.ts
@@ -1,4 +1,4 @@
-// Type definitions for Knockout v3.2.0-beta
+// Type definitions for Knockout v3.2.0
// Project: http://knockoutjs.com
// Definitions by: Boris Yankov , Igor Oleinikov , Clément Bourgeois
// Definitions: https://github.com/borisyankov/DefinitelyTyped
@@ -559,92 +559,88 @@ interface KnockoutBindingProvider {
getBindingAccessors?(node: Node, bindingContext: KnockoutBindingContext): { [key: string]: string; };
}
-interface KnockoutComponents {
- // overloads for register method:
- register(componentName: string, config: KnockoutComponentRegister): void;
- register(componentName: string, config: KnockoutComponentRegisterStringTemplate): void;
- register(componentName: string, config: KnockoutComponentRegisterFnViewModel): void;
- register(componentName: string, config: KnockoutComponentRegisterStringTemplateFnViewModel): void;
- register(componentName: string, config: KnockoutComponentRegisterAMD): void;
- register(componentName: string, config: {}): void;
-
- isRegistered(componentName: string): boolean;
- unregister(componentName: string): void;
- get(componentName: string, callback: (definition: KnockoutComponentDefinition) => void): void;
- clearCachedDefinition(componentName: string): void
- defaultLoader: KnockoutComponentLoader;
- loaders: KnockoutComponentLoader[];
- getComponentNameForNode(node: Node): string;
-}
-
-/* interfaces for register overloads*/
-
-interface KnockoutComponentRegister {
- template: KnockoutComponentTemplate;
- viewModel?: KnockoutComponentConfigViewModel;
-}
-
-interface KnockoutComponentRegisterAMD {
- // load self-describing module using AMD module name
- require: string;
-}
-
-interface KnockoutComponentRegisterFnViewModel {
- template: KnockoutComponentTemplate;
- viewModel?: (params: any) => any;
-}
-
-interface KnockoutComponentRegisterStringTemplate {
- template: string;
- viewModel?: KnockoutComponentConfigViewModel;
-}
-
-interface KnockoutComponentRegisterStringTemplateFnViewModel {
- template: string;
- viewModel?: (params: any) => any;
-}
-
-interface KnockoutComponentConfigViewModel {
- instance?: any;
- createViewModel? (params?: any, componentInfo?: KnockoutComponentInfo): any;
- require?: string;
-}
-
-interface KnockoutComponentTemplate {
- // specify element id (string) or a node
- element?: any;
- // AMD module load
- require?: string;
-}
-
-interface KnockoutComponentInfo {
- element: Node;
-}
-/* end register overloads */
-interface KnockoutComponentDefinition {
- template: Node[];
- createViewModel?(params: any, options: { element: Node; }): any;
-}
-
-interface KnockoutComponentLoader {
- getConfig? (componentName: string, callback: (result: KnockoutComponentConfig) => void): void;
- loadComponent? (componentName: string, config: KnockoutComponentConfig, callback: (result: KnockoutComponentDefinition) => void): void;
- loadTemplate? (componentName: string, templateConfig: any, callback: (result: Node[]) => void): void;
- loadViewModel? (componentName: string, viewModelConfig: any, callback: (result: any) => void): void;
- suppressLoaderExceptions?: boolean;
-}
-
-interface KnockoutComponentConfig {
- template: any;
- createViewModel?: any;
-}
-
interface KnockoutComputedContext {
getDependenciesCount(): number;
isInitial: () => boolean;
isSleeping: boolean;
}
+//
+// refactored types into a namespace to reduce global pollution
+// and used Union Types to simplify overloads (requires TypeScript 1.4)
+//
+declare module KnockoutComponentTypes {
+
+ interface Config {
+ viewModel: ViewModelFunction | ViewModelSharedInstance | ViewModelFactoryFunction | AMDModule;
+ template: string | Node[]| DocumentFragment | TemplateElement | AMDModule;
+ }
+
+ interface ComponentConfig {
+ template: any;
+ createViewModel?: any;
+ }
+
+ interface EmptyConfig {
+ }
+
+ // common AMD type
+ interface AMDModule {
+ require: string;
+ }
+
+ // viewmodel types
+ interface ViewModelFunction {
+ (params?: any): any;
+ }
+
+ interface ViewModelSharedInstance {
+ instance: any;
+ }
+
+ interface ViewModelFactoryFunction {
+ createViewModel: (params?: any, componentInfo?: ComponentInfo) => any;
+ }
+
+ interface ComponentInfo {
+ element: any;
+ }
+
+ interface TemplateElement {
+ element: string | Node;
+ }
+
+ interface Loader {
+ getConfig? (componentName: string, callback: (result: ComponentConfig) => void): void;
+ loadComponent? (componentName: string, config: ComponentConfig, callback: (result: Definition) => void): void;
+ loadTemplate? (componentName: string, templateConfig: any, callback: (result: Node[]) => void): void;
+ loadViewModel? (componentName: string, viewModelConfig: any, callback: (result: any) => void): void;
+ suppressLoaderExceptions?: boolean;
+ }
+
+ interface Definition {
+ template: Node[];
+ createViewModel? (params: any, options: { element: Node; }): any;
+ }
+}
+
+interface KnockoutComponents {
+ // overloads for register method:
+ register(componentName: string, config: KnockoutComponentTypes.Config | KnockoutComponentTypes.EmptyConfig): void;
+
+ isRegistered(componentName: string): boolean;
+ unregister(componentName: string): void;
+ get(componentName: string, callback: (definition: KnockoutComponentTypes.Definition) => void): void;
+ clearCachedDefinition(componentName: string): void
+ defaultLoader: KnockoutComponentTypes.Loader;
+ loaders: KnockoutComponentTypes.Loader[];
+ getComponentNameForNode(node: Node): string;
+}
+
+
+
+
+
declare module "knockout" {
export = ko;
}
diff --git a/knockout/tests/knockout-tests.ts b/knockout/tests/knockout-tests.ts
index 7b0c8174e5..e9334a7534 100644
--- a/knockout/tests/knockout-tests.ts
+++ b/knockout/tests/knockout-tests.ts
@@ -605,52 +605,50 @@ function test_allBindingsAccessor() {
};
}
+
function test_Components() {
+ // test all possible ko.components.register() overloads
function test_Register() {
- // test all possible ko.components.register() overloads
+ // reused parameters
var nodeArray = [new Node, new Node];
var singleNode = new Node;
+ var viewModelFn = function (params: any) { return null; }
- // ------- string-templates with different viewmodel overloads:
+ // ------- viewmodel overloads:
- // string template and inline function (commonly used in examples)
- ko.components.register("name", { template: "string-template", viewModel: function (params) { return null; } });
+ // viewModel as inline function (commonly used in examples)
+ ko.components.register("name", { template: "string-template", viewModel: viewModelFn });
- // string template and instance vm
+ // viewModel from shared instance
ko.components.register("name", { template: "string-template", viewModel: { instance: null } });
- // string template and createViewModel factory method
- ko.components.register("name", { template: "string-template", viewModel: { createViewModel: function (params: any, componentInfo: KnockoutComponentInfo) { return null; } } });
+ // viewModel from createViewModel factory method
+ ko.components.register("name", { template: "string-template", viewModel: { createViewModel: function (params: any, componentInfo: KnockoutComponentTypes.ComponentInfo) { return null; } } });
- // string template and require module vm
+ // viewModel from an AMD module
ko.components.register("name", { template: "string-template", viewModel: { require: "module" } });
- // ------- non-string templates
+ // ------- template overloads
- // viewmodel as function and four types of template
- ko.components.register("name", { template: { element: "elementID" }, viewModel: function (params) { return null; } });
- // Node template for element and inline function (commonly used in examples)
- ko.components.register("name", { template: { element: singleNode }, viewModel: function (params) { return null; } });
- // object template for element and inline function (commonly used in examples)
- ko.components.register("name", { template: nodeArray, viewModel: function (params) { return null; } });
- // object template for element and inline function (commonly used in examples)
- ko.components.register("name", { template: { require: "module" }, viewModel: function (params) { return null; } });
-
- // viewmodel as object, and four types of non-string tempalte
- ko.components.register("name", { template: { element: "elementID" }, viewModel: { instance: null } });
- // Node template for element and inline function (commonly used in examples)
- ko.components.register("name", { template: { element: singleNode }, viewModel: { instance: null } });
- // object template for element and inline function (commonly used in examples)
- ko.components.register("name", { template: nodeArray, viewModel: { instance: null } });
- // object template for element and inline function (commonly used in examples)
- ko.components.register("name", { template: { require: "module" }, viewModel: { instance: null } });
+ // template from named element
+ ko.components.register("name", { template: { element: "elementID" }, viewModel: viewModelFn });
+
+ // template using single Node
+ ko.components.register("name", { template: { element: singleNode }, viewModel: viewModelFn });
+
+ // template using Node array
+ ko.components.register("name", { template: nodeArray, viewModel: viewModelFn });
+
+ // template using an AMD module
+ ko.components.register("name", { template: { require: "text!module" }, viewModel: viewModelFn });
// Empty config for registering custom elements that are handled by name convention
- ko.components.register('name', { /* No config needed */ });
+ ko.components.register('name', { /* No config needed */ });
}
}
+
function testUnwrapUnion() {
var possibleObs: KnockoutObservable | number;