我刚刚看到这行代码检查变量是否为数组:
export const isArray = Array.isArray || (<T>(x: any): x is T[] => x && typeof x.length === 'number');
isArray([1, 2, 3, 4, 5])
我真的很困惑如何理解(<T>(x: any): x is T[] => x && typeof x.length === 'number')
。如何理解铸造和表达?
请注意,我来自JavaScript背景,因此我了解Array.isArray
和x.length
部分。
答案 0 :(得分:2)
<T>(x: any): x is T[]
- 这是该功能的签名。该函数是通用的(<T>
),带有any
参数。此函数签名也是一个类型保护,这意味着它会影响调用后参数的类型,即如果x
返回true,T[]
的类型将为isArray
x is T[]
})所以
const isArray = (<T>(x: any): x is T[] => x && typeof x.length === 'number');
let x: any;
if(isArray<number>(x)) {
console.log(x[0]) // x is an array
}
下一部分是函数的主体,它只检查length
是否存在且是number
x && typeof x.length === 'number'
注意强>
Array.isArray
的签名与替换签名(<T>(x: any): x is T[]
)不同。为了允许isArray
用作类型保护,我建议将声明更改为:
export const isArray = Array.isArray as (<T>(x: any) => x is T[])
|| (<T>(x: any): x is T[] => x && typeof x.length === 'number');
答案 1 :(得分:0)
类型表达式
x is T[]
在TypeScript中称为user defined type guards。本质上它给出了类型检查器的提示,这样如果函数调用isArray(x)
返回true,则x的类型将缩小为T[]