开发者问题收集

类型字符串 | 即使在 if 检查和空断言之后也不允许为空“可能为空”

2021-04-09
95

我有一个变量定义为:

let filter: string | null;

然后我尝试使用它:

filter = "my query";
let translatedStatesName = ["query", "my"];

if(filter) {
    const getFullWordfromQuery = translatedStatesName.filter((a) => a.toLowerCase().
        includes(filter.toLowerCase()));
}

即使在 if 检查之后,编译器也会抱怨 filter“可能为空”,这可能是由于其类型。由于内部编码指南,我无法使用空断言,例如:

filter!

如何在不使用空断言的情况下解决它?操场: https://www.typescriptlang.org/play?ssl=8&ssc=2&a​​mp;pln=2&pc=1#code/DYUwLgBAZglsYgE4C4IGcyJgOwOYQB8JsBXYYAbgFgAoWeJCAXggCIBbATwgEcSlOrajVCRMAQ2xpg4hABMAymFkg0AOXHsQzC AG1WfAa WA0bLqwC6w2jCgAKegkQBKCAG9aELxADGAeylIXHAAMTJGAHU-RDkoRD92AEV+RG4WCSkZeSUVdU0QADpHJDs7cVcmAD4IcQKwPwAZPwB3JABhcTQQO2cCz28BnB9gEjlVBzgnOsaW9s7u50XhaAF9aWg B6ddJyGrQuxDAYAOhJpABCYj9IcXJZuSA<​​/a>

2个回答

尝试将过滤器的小写字母存储在变量中

if(filter) {
    let toLowerCaseFilter = filter.toLowerCase();
    const getFullWordfromQuery = translatedStatesName.filter((a) => a.toLowerCase().includes(toLowerCaseFilter));
}
Arsen
2021-04-09

TS 不知道箭头函数何时被调用,过滤器可以在那时被修改。

你可以捕获过滤器的值,让 TS 知道该值不会被重新分配。

if(filter) {
    const filterCapture = filter;
    const getFullWordfromQuery = translatedStatesName.filter((a) => a.toLowerCase().includes(filterCapture.toLowerCase()));
}

游乐场链接

查看类似问题: 对象属性的类型保护推断在嵌套范围中丢失 #30576

Lesiak
2021-04-09