我应该如何强制 TypeScript 理解这个数组中不会有任何空值?



我来自JavaScript和学习TypeScript。我习惯于通过使用.filter(x => x)从数组中过滤null,然而,使用TypeScript它要求我定义数组可以包含null,这不是真的,因为filter从数组中删除了所有null:

interface ILabels {
alias: string
publicKey: string
lat: number
long: number
}
const labels: ILabels[] = data.map((d) => {
if (d.lat && d.long) {
return {
alias: d.alias || d.publicKey,
publicKey: d.publicKey,
lat: d.lat,
long: d.long,
};
}
return null;
}).filter((x) => x);

我应该如何强迫TypeScript理解在这个数组中不会有任何null?TypeScript给我的错误是:

TS2322: Type '({alias: string;publicKey:字符串;纬度:数量;长:数量;} | null)[]'不能赋值给类型' illabels[]'。键入'{别名:字符串;publicKey:字符串;纬度:数量;长:数量;} | null'不能赋值给类型' illabels '。类型'null'不能赋值给类型' ilabel '。

一种方法是使用用户定义的类型保护:

function nonNull<T>(val: T | null): val is T {
return val !== null;
}
const labels: ILabels[] = data.map((d) => {
if (d.lat && d.long) {
return {
alias: d.alias || d.publicKey,
publicKey: d.publicKey,
lat: d.lat,
long: d.long,
};
}
return null;
}).filter(nonNull);

或者,带箭头函数:

const labels: ILabels[] = data.map((d) => {
if (d.lat && d.long) {
return {
alias: d.alias || d.publicKey,
publicKey: d.publicKey,
lat: d.lat,
long: d.long,
};
}
return null;
}).filter(<T,>(x: T | null): x is T => x !== null);

最新更新