(<t>(x:any):x是T [] =&gt; x&amp;&amp; typeof x.length ===&#39; number&#39;)

时间:2018-01-26 03:46:55

标签: typescript

我刚刚看到这行代码检查变量是否为数组:

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.isArrayx.length部分。

2 个答案:

答案 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[]