Pull to refresh

Comments 11

Интересный пример использования Proxy. А как обстоят дела с instanceof и несколькими параметрами типа myRange в одном методе?
Можно еще перегруженные методы добавить.

  1. instanceof для типизированного класса: Новый типизированный класс является объектом Object и соответственно Function.
  2. instanceof для объекта типизированного класса скажет нам, что и типизированный класс и нетипизированный класс есть в цепочке прототипов. Другими словами:
    console.log(typedInstance instanceof TestClass);// true
    console.log(typedInstance instanceof TypedMyClass);// true

    так получается, потому что ловушка getPrototypeOf не определена. Я это сделал умышлено — для возможности определения типизирован ли объект или нет.


    Несколько параметров в одном методе все хорошо. используйте сколько угодно параметров. Так делать можно и нужно:
    method(myRangeValueFirst, myRangeValueFirst)

    Можно еще перегруженные методы добавить.
    Точно — это идея мне не пришла в голову. Она достаточно тривиально реализуется. PR are welcome, как говорится).

Черт ошибочка небольшая.
Несколько параметров в одном методе все хорошо. Используйте сколько угодно параметров. Так делать можно и нужно:


method(myRangeValueFirst, myRangeValueSecond)

А почему бы не использовать Typescript, декораторы и reflect-metadata (например, как тут, см. в конце)?

Да можно и Typescript использовать для похожих целей. Только, что делать если ты уже написал класс на чистом javascript?

Достаточно декларировать этот класс в .d.ts-файле и подключить этот файл к компиляции. А в целом, ts является надмножеством js, так что валидный js-код будет валидным ts-кодом.
Если, например, класс написан в "es6-стиле", то можно просто изменить расширение файла на .ts. А чтобы компилятор не ругался на отсутствующие поля, достаточно просто их перечислить. Т.е.


// foo.js
export class Foo {
    constructor() {
        this.foo = 1;
    }
}

// foo.ts
export class Foo {
    foo; // указываем, что есть такое поле. если не указать явно, тип будет any.

    constructor() {
        this.foo = 1;
    }
}

Если класс написан в "es5-стиле", то достаточно изменить расширение на .ts и продекларировать тип:


// foo.js -> foo.ts
var Foo = (function () {
    function Foo() {
        this.foo = 1;
    }
    Foo.prototype.sum = function (x) {
        return this.foo + x;
    };
    return Foo;
}());

module.exports = Foo;

// foo.d.ts
declare class Foo {
    foo: any;
    sum(x: number): number;
}

Прочел про декораторы в TypedScript и действительно можно очень классно и быстро реализовать так называемую типизацию. Эта штука выглядит даже немного приятнее. Кстати я и в начале статьи написал, что можно обойтись декораторами(в понятиях ES5). Все ведь знают, что очень часто существует более чем один способ решить задачу. Это всего лишь мой взгляд на ситуацию.

Эта штука ещё слишком сырая:


    @xxx
    yyy( a: Foo[] ){
        return a
    }

    Foo.prototype.yyy = function (a) {
        return a;
    };
    __decorate([
        xxx, 
        __metadata('design:type', Function), 
        __metadata('design:paramtypes', [Array]), 
        __metadata('design:returntype', void 0)
    ], Foo.prototype, "yyy", null);
Есть и другие инструменты проверки типов в рантайме(а, также на этапе трансляции/сборки).
Из известного мне — github.com/codemix/babel-plugin-typecheck.

Это плагин к babel, который автоматически добавляет проверки на тип, если вы описали тип.
Для описания типов используется flow type (http://flowtype.org/) синтаксис.

плюсы:
+ возможность проверять не только входящие аргументы, но и локальные переменные.
+ не нужна принудительная верблюжья нотация для описания типов — для описания типов используется отдельный синтаксис.
+ не нужно как-то особо описывать используемые вами классы
плагин самостоятельно сгенерит typeof/instanceof-проверки, если вы задали настоящий JS-тип для переменной
+ скорость в рантайме. Не приходится использовать Proxy, а сами проверки встраиваются инлайново, а не вызовами функций.
+ оттранслированный код работает в любом окружении, а не только там, где есть Proxy.
минусы:
— не всем может понравится синтасис описания типов в коде.
Это уже не чистый JS, хотя и поддерживаемый некоторыми IDE
UFO just landed and posted this here
Да нет же, это две независимых вещи
typescript, насколько я понимаю язык, в котором синтаксис типов является хоть и центральной, но далеко не единственной синтаксической фичей
flowtype же, это инструмент статического анализа, который позволяет проверять типы, и на этом все
При этом я полагаю что делает он эту задачу лучше(во всяком случае в первом примере для flowtype, typescript не видит никаких проблем)

И да, к слову, flowtype все-таки позволяет описывать типы в комментариях.
То есть вы все-таки можете использовать типы, и при этом писать «чистый» JS.
Правда сам синтаксис остается принципиально тем же(просто экранирован комментариями), так что в этом мало смысла, если вы используете IDE, знающую о flowtype — поэтому я не вижу смысла в этой «чистоте».
Но это скорее дело личного вкуса.
Sign up to leave a comment.

Articles