if в паре с typeof) где-то далеко в муках умирает пони-единорог. Очевидно, что в компайл-тайме типы проверяться не будут, получится тот же самый JS, только плохо читаемый.Надо, чтобы можно было обращаться с ответом так же, как с основными типами (число складывать, массив сортировать и т.п)
getItemList он будет из JSON формировать и возвращать CollectionServerResponse<Item>, а на getItemById - ObjectServerResponse<Item>.interface IItemService {
getItemList(): CollectionServerResponse<Item>;
getItemById(id: number): ObjectServerResponse<Item>;
}но при этом добавить общие методы для абстракции, вроде getStatusCode (получить код ответа), getHeaders() и т.д
class ServerResponse {
public getStatusCode(): number {...}
public getHeaders(): string[] {...}
}
class CollectionServerResponse<T> extends ServerResponse
{...}
class ObjectServerResponse<T> extends ServerResponse
{...} Number, Object... как можно обращаться с ответом также, как ними
myNum1.add( myNum2 )class Repository {
private _json: string = '{ "num": 3, "arr": [ 1, 2 ] }';
public getNumber(): ServerResponse<number> {
const obj = JSON.parse(this._json);
return new ServerResponse<number>(obj.num);
}
public getNumberList(): ServerResponse<number[]> {
const obj = JSON.parse(this._json);
return new ServerResponse<number[]>(obj.arr);
}
}
class ServerResponse<T> {
// public getStatusCode(): number {...}
// public getHeaders(): string[] {...}
public value(): T {
return this._value;
}
public constructor(value: T) {
this._value = value;
}
private _value: T;
}
// Usage ----------------
const repo = new Repository();
function logNumber(num: ServerResponse<number>): void {
console.log(`I expects number only! The value is ${num.value()}`);
}
logNumber( repo.getNumber() ); // OK
logNumber( repo.getNumberList() ); // Compile-time error![перегрузка] эмм... поддерживает
function add(x: string, y: string): string{ // Error: duplicate function implementation
return [x, y].join('+');
}
function add(x: number, y: number): number{ // Error: duplicate function implementation
return x + y;
}[неявный кастинг] тоже поддерживает
as number. Да и вообще он странный, ибо практической пользы от такого неуправляемого кастинга минимум.Object.prototype.valueOf и Object.prototype.toString. Крайнее работает годно и прогнозируемо, а вот с valueOf траблы:const MyCustomType = (function () {
function MyCustomType(n) {
this._data = n;
}
MyCustomType.prototype.valueOf = function () {
return this._data;
};
return MyCustomType;
}());
const obj = new MyCustomType(3);
console.log("Value is " + (obj + 2)); // OKclass MyCustomType {
public constructor(n: number) {
this._data = n;
}
public valueOf(): number { // nobody cares )"=
return this._data;
}
private _data: number;
}
const obj = new MyCustomType(3);
// error TS2365: Operator '+' cannot be applied to types 'MyCustomType' and '2'.
console.log(`Value is ${obj + 2}`);Это уже ограничения JS и TS тут не причем.
Typescript поддерживает перегрузку функций, а реализация перегрузки - это уже детали.
Не забывайте что Typescript это Транспайлер, а не Компилятор.
тип данных получаемых через сеть не может быть гарантирован
Если в нем будет неявный кастинг, то какой от него толк? Чем TS тогда будет отличаться от JS?