Typescript 检查变量为 null 或未定义
2021-01-26
14609
抱歉,不确定如何描述我的问题。希望标题没有误导您。
首先,我的问题发生在启用了严格模式的 Angular 11 中。
假设我有一个数组
let results: T[] = [];
并且我有一个如下函数,并且该函数在 Visual Studio Code 中不会给出任何错误。
filter = (values: (T | null | undefined)[]): T[] => {
for(let value of values) {
if (value !== null && value !== undefined) {
results.push(value);
}
}
}
但是,如果我将条件提取到另一个函数,例如
isNullOrUndefined = (value: T | null | undefined): bool => {
return value === null || value === undefined;
}
然后在上面的
filter
函数中使用该函数,如下所示:
filter = (values: (T | null | undefined)[]): T[] => {
for(let value of values) {
if (!isNullOrUndefined(value)) {
results.push(value);
}
}
}
我收到错误
类型为“Nullable<T>”的参数不能分配给类型为“T”的参数。
有人可以帮忙看看吗?谢谢
2个回答
问题在于
isNullOrUndefined
函数的类型。
当您使用这样的条件时
if (value !== null && value !== undefined) {
results.push(value); // value is only T here
它被用作类型约束。Typescript 会自动将
if
分支中的值类型限制为
T
。
但是如果您使用返回
boolean
的
isNullOrUndefined
,Typescript 不会检查函数的实际实现 - 即使您没有明确指定返回类型。
if (!isNullOrUndefined(value)) {
results.push(value); // value still is T | null | undefined
}
为了使其工作,您还需要将
isNullOrUndefined
键入为类型约束,方法是将返回类型指定为
value is null | undefined
isNullOrUndefined = (value: T | null | undefined): value is null | undefined => {
return value === null || value === undefined;
}
然后 Typescript 的行为将与原始版本相同。
if (!isNullOrUndefined(value)) {
results.push(value); // value is T
}
kvetis
2021-01-26
一种简便的方法是
let show = !input ? false : true;
let input = null;
let show = !input ? false : true;
console.log("show: " + input + " --> " + show);
input = undefined;
show = !input ? false : true;
console.log("show: " + input + " --> " + show);
input = false;
show = !input ? false : true;
console.log("show: " + input + " --> " + show);
input= true;
show = !input ? false : true;
console.log("show: " + input + " --> " + show);
返回
show: null --> false
show: undefined --> false
show: false --> false
show: true --> true
Werner Diwischek
2023-01-04