如何使用括号表示法检查打字稿中的无效性



我想检查对象中的数组是否存在,不为空且不为空

我需要在括号表示法中引用该属性。

我的对象

profile = {
myArray: [1,2,3]
}

我正在这样检查它

const section = "myArray";
if(section in profile && profile[section] && profile[section].length ) { // do something}

我希望这可以工作,但我在这部分profile[section].length收到一个错误,说object is possibly null or undefined

如果我使用点符号来做,它可以正常工作

if('myArray' in profile && profile.myArray && profile.myArray.length ) { // do something}

像这样使用可选的链接

if (profile?.[section]?.length) { // do something }

见 https://stackoverflow.com/a/58780897

这是一个已知的错误,其修复存在,但由于可能的性能问题,可能无法将其纳入语言。

我们在等待时能做什么? 好吧,一种可能的解决方法是引入一个用户定义的类型保护函数,该函数在内部执行相同的检查,但强制编译器按照您希望的方式缩小对象的类型:

function hasDefinedProp<T, K extends keyof T>(
obj: T,
k: K
): obj is T & Required<Pick<T, K>> {
return !!obj[k];
}

类型T & Required<Pick<T, K>>表示它与T的类型相同,只是K键属性是必需的,因此不可为空/未定义。 让我们看看它的实际效果:

if (
section in profile &&
hasDefinedProp(profile, section) &&
profile[section].length // okay now
) {
// do something
}

看起来不错! 希望有帮助;祝你好运。

链接到代码

相关内容

最新更新