Хотя на первый взгляд может показаться, что эти две записи делают одно и то же, на самом деле это не так. Как правило, выражения типа приведение типа, как во втором примере, вы фактически ослабляете компилятор и можете пропустить ошибки типа, которые вы могли бы увидеть.
Пример:
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.