我来自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);