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