В чем разница между вызовом Generi c и ... как кастинг в Angular / Typescipt? Специально для HttpClient - PullRequest
3 голосов
/ 20 апреля 2020

У меня есть следующая проблема.

Некоторые опытные программисты сказали мне, чтобы я никогда не использовал дженерики в http. Методы:


public getAll(): Observable<User[]> {
    return this.http.get<User[]>(url);
}

И что я всегда должен использовать:


public getAll(): Observable<User[]> {
    return this.http.get(url) as Observable<User[]>;
}

Никто не может объяснить, почему , Это соглашение (?), Но трудно понять, почему. Есть ли какой-то «исторический смысл» или это просто для надежности?

1 Ответ

4 голосов
/ 20 апреля 2020

Хотя на первый взгляд может показаться, что эти две записи делают одно и то же, на самом деле это не так. Как правило, выражения типа приведение типа, как во втором примере, вы фактически ослабляете компилятор и можете пропустить ошибки типа, которые вы могли бы увидеть.

Пример:

function copy<T>(object: T): T {
    return {
        ...object
    };
}

class Car {
    armCount = 2;
    wheelCount = 4;
}

class Human {
    armCount = 2;
    wheelCount = 2;

    getDuplicatedArmCount() {
        return this.armCount * 2;
    }
}

const car = new Car();

const carCopy = copy<Car>(car); // 1
const humanCopy = copy<Human>(car); // 2
const humanCopyAndCast = copy(car) as Human; // 3

console.log(humanCopy.getDuplicatedArmCount());
console.log(humanCopyAndCast.getDuplicatedArmCount()); // 4

Это функция, которая (плохо) копирует объект. Очевидно, что при копировании чего-либо результат будет того же типа, что и оригинал. Это то, что говорит общее c определение T.

Теперь, когда вы скомпилируете этот код, вы увидите, что

  • 1) просто отлично,
  • 2) выдает ошибку компилятора, когда вы пытаетесь скопировать автомобиль, но ожидаете, что человек в конце, с методом getDuplicatedArmCount,
  • , но с 3), в основном говорит компилятору вы более умны, чем это, вы не получите эту ошибку при компиляции, и вместо этого в 4) возникнет проблема времени выполнения, которую можно легко избежать.

Обновление : Обновлен пример, который теперь содержит метод getDuplicatedArmCount, чтобы также продемонстрировать проблему с ванильными настройками TypeScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...