Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Чтобы использовать какой-то внешний инструмент (читай «библиотеку» или «фреймворк»), тогда сигнатуру каждого из методов каждого модуля этого инструмента необходимо описатьНе обязательно, можно «заткнуть» какую-то библиотеку через any. Например, допустим нет определений для jQuery, но её можно использовать просто описав так:
var $: any;а разработку тратится больше времени, в сравнении с JavaScript. Это вызвано тем, что помимо реализации класса необходимо описать все задействованные интерфейсы, сигнатуры методов.Это достаточно распространенное заблуждение. На самом деле, типы можно определять «на ходу», т.е. inline. Например:
f(arg: { p: number; }): void;p типа number. Или так: f() { return { p: 10; }; }{ p: number; }var foo: { [key: string]: number; }
foo = {};
foo.foobar = 10; // error
Потому что вы не определили свойство foobar. Но можно так:var foo: { [key: string]: number; }
foo = {};
foo['foobar'] = 10; // OK
interface SomeType {
new (value: string): Instance;
new (value: number, value2: {}): Instance;
}
This is because when a class implements an interface, only the instance side of the class is checked. Since the constructor sits in the static side, it is not included in this check.
SomeType реализует тип typeof SomeClass (т.е. глобальная джаваскрипт переменная SomeClass), а не инстанс SomeClass, как вы описали.var foo: { [key: string]: number; }
foo = {};
foo['foobar'] = 10; // OK
var foo = { bar : 10 };
foo['__cache__'] = {}; // OK
foo['foobar'] вполне понятно почему разрешен — вы объявили индексатор, и компилятор подчиняется. Вопрос в том, почему нельзя написать foo.foobar — возможно, это сделали так, чтобы не давать разработчику иллюзию типобезопасности. Код вида foo.barbar от foo.baibar на глаз отличается плохо, а в ts привыкаешь, что наличие свойства проверяет компилятор, и ошибка неочевидно. Другое дело — индексатор, в котором достаточно очевидна необходимость удостовериться в идентичности ключей.(function (A){
"use strict";
A.module('app').factory('FactoryName', [ '$resource', '$sce', function($resource, $sce){
var r = $resource('/api/url/:id/', {
id: '@id'
}, {
update: {
method: 'PATCH'
}
});
function Factory(){
// Код инициализации
}
// Расширение прототипа свойствами и методами
Factory.prototype.someMethod = function(){
return $sce.trustAsHtml(this.someProperty);
};
return Factory;
}]);
}(this.angular));angular.module('app').factory('FactoryName', ['$resource', '$sce', function ($resource, $sce) {
var apiObjectResource = $resource('/api/url/:id/', {
id: '@id'
}, {
update: {
method: 'PATCH'
}
});
return new Factory($sce, apiObjectResource);
}]);
class Factory {
$sce: ng.ISCEService;
apiObjectResource: angular.resource.IResource<APIObject>;
someProperty;
constructor($sce, apiObjectResource) {
this.$sce = $sce;
this.apiObjectResource = apiObjectResource;
}
someMethod() {
return this.$sce.trustAsHtml(this.someProperty);
};
}
class APIObject {
id: number;
}
TypeScript: общие впечатления