Typescript (<;T>;(x:any):x是T[]=>;x&;typeof x.length===&&x27;number&&x27;)

Typescript (<;T>;(x:any):x是T[]=>;x&;typeof x.length===&&x27;number&&x27;),typescript,Typescript,我刚刚遇到了这行代码,它检查变量是否是数组: export const isArray = Array.isArray || (<T>(x: any): x is T[] => x && typeof x.length === 'number'); isArray([1, 2, 3, 4, 5]) export const isArray=Array.isArray | |((x:any):x是T[]=>x&&typeof x.length=='number

我刚刚遇到了这行代码,它检查变量是否是数组:

export const isArray = Array.isArray || (<T>(x: any): x is T[] => x && typeof x.length === 'number');

isArray([1, 2, 3, 4, 5])
export const isArray=Array.isArray | |((x:any):x是T[]=>x&&typeof x.length=='number');
isArray([1,2,3,4,5])
我真的很困惑如何理解
((x:any):x是T[]=>x&&typeof x.length=='number')
。如何理解铸造和表达

请注意,我来自JavaScript背景,因此我了解
Array.isArray
x.length
部分。

(x:any):x是T[]
-这是函数的签名。该函数是通用的(
),带有
任何
参数。此函数签名也是一种类型保护,这意味着它会影响调用后参数的类型,即如果
isArray
返回true(
x是T[]
),则
x的类型将是
T[]

注意

数组.isArray的签名与替换的签名不同(
(x:any):x是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');
export const isArray=Array.isArray as((x:any)=>x是T[])
||((x:any):x是T[]=>x&&typeof x.length==='number');
类型表达式

x is T[]
在TypeScript中调用。本质上,它向类型检查器提供提示,如果函数调用
isArray(x)
返回true,则x的类型将缩小为
T[]

export const isArray  = Array.isArray as (<T>(x: any) => x is T[]) 
    || (<T>(x: any): x is T[] => x && typeof x.length === 'number');
x is T[]