【发布时间】:2021-03-04 23:13:40
【问题描述】:
我在玩打字稿,发现了一些意想不到的东西。
我可以在showCarInfo2 函数中看到一个错误
为什么我不能对非空断言使用函数?
在第一个函数showCarInfo1 中有car.passengers !== null,一切正常。
interface Car {
name: string;
passengers: string[] | null;
}
const car: Car = {
name: 'Seat',
passengers: ['Andrew', 'Kate'],
}
function showCarInfo1(car: Car) {
if(car.passengers !== null) {
console.log(`${car.name}${car.passengers.map(passenger => ` ,${passenger}` )}`)
} else {
console.log(car.name)
}
}
showCarInfo1(car)
const hasPassengers = (car: Car) => car.passengers !== null;
function showCarInfo2(car: Car) {
if(hasPassengers(car)) {
console.log(`${car.name}${car.passengers.map(passenger => ` ,${passenger}` )}`)
} else {
console.log(car.name)
}
}
【问题讨论】:
-
在大多数情况下,TypeScript 中的检查是不可传递的。如果你这样做了,例如
x = foo !== null; if (x) { foo++},你仍然会得到一个错误。这是一个常见问题,也是一个已知问题。遍历传递条件并通过它们推断类型显然对编译器来说非常昂贵。 -
@VLAZ 是否有任何好的解决方案,或者我是否应该始终使用 `car.passengers !== null` 之类的断言,即使我必须在多个地方这样做?
-
您可以创建一个user defined type-guard。但是您还需要一些围绕它的支持基础设施。我会尝试发布答案。
标签: typescript