SteveSanderson / knockout-es5

Knockout.js meets ECMAScript 5 properties
158 stars 39 forks source link

Add to definitely typed? #42

Open grofit opened 9 years ago

grofit commented 9 years ago

Any chance we could get a d.ts file to add the tracking and stuff to the ko interface.

archangel-irk commented 9 years ago

I have never created such a file, it will be cool if someone will make a PR. If I manage to find time, I will try to understand this topic.

aligneddev commented 8 years ago

Someone created one: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/knockout.es5

dazinator commented 8 years ago

I'm having problems using the knockout.es5 typing mentioned above.

I can't add an import statement because the typing doesn't appear to export anything. I.e typescript won't let me do this:

import knockoutes5 = require("knockout-es5");

because it says "knockout-es5" isn't a module.

Any ideas how to solve this?

grofit commented 8 years ago

I am not sure if it has been updated but I ended up editing the default one, here is how it looks:

// Type definitions for Knockout-ES5
// Project: https://github.com/SteveSanderson/knockout-es5
// Definitions by: Sebastián Galiano <https://github.com/sgaliano/>
// Definitions: https://github.com/borisyankov/DefinitelyTyped

/// <reference path="../knockout/knockout.d.ts" />

interface KnockoutStatic {
    track(obj: any, propertyNames?: Array<string>): any;
    defineProperty(obj: any, propertyName: string, evaluator: Function): any;
    defineProperty(obj: any, propertyName: string, options: KnockoutDefinePropertyOptions): any;
    getObservable(obj: any, propertyName: string): KnockoutObservable<any>;
    valueHasMutated(obj: any, propertyName: string): void;
}

interface KnockoutDefinePropertyOptions {
    get(): any;
    set?(value: any): void;
}

interface Array<T> {
    remove(item: T): T[];
    removeAll(items: T[]): T[];
    removeAll(): T[];

    destroy(item: T): void;
    destroyAll(items: T[]): void;
    destroyAll(): void;
}

declare module "knockout-es5" {
    export = ko;
}

Then I do

import * as ko from "knockout-es5"

dazinator commented 8 years ago

Thanks @grofit

Is the import for knockout still needed when you do that - or can I just import es5?

I am currently doing this:

import knockout = require("knockout");
import * as ko from "knockout-es5"

Cheers!

grofit commented 8 years ago

the d.ts should not effect things, to my knowledge you do import * as ko from "knockout-es5" and everything works as I think internally knockout-es5 includes knockout and proxies it, so you should be ok to just call the one include.

The ONLY quirk around this I found was libraries that self extend the ko instance like knockout-validation will not work without knockout being explicitly included, so I am having to mix and match es-5 and normal knockout based upon if I need validation etc.

I will raise an issue on ko validation around this.

dazinator commented 6 years ago

Just updated my definitions and having problems getting es5 working again now that KnockoutStatic seems to have been removed in the latest knockout typings.

I have openedup a stack overflow here: https://stackoverflow.com/questions/47671487/knockout-es5-typings - would really appreciate a working example!