IsTuple
问题描述
实现一个类型IsTuple
,它接受输入类型T
并返回是否T
为元组类型。
举例:
type case1 = IsTuple<[number]> // true
type case2 = IsTuple<readonly [number]> // true
type case3 = IsTuple<number[]> // false
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
type cases = [
Expect<Equal<IsTuple<[]>, true>>,
Expect<Equal<IsTuple<[number]>, true>>,
Expect<Equal<IsTuple<readonly [1]>, true>>,
Expect<Equal<IsTuple<{ length: 1 }>, false>>,
Expect<Equal<IsTuple<number[]>, false>>,
Expect<Equal<IsTuple<never>, false>>,
]
// ============= Your Code Here =============
type IsTuple<T> = [T] extends [never]
? false
: T extends readonly any[]
? number extends T['length']
? false
: true
: false
let a1 = [1, 1, 2, 3, 4] as const // readonly [1, 1, 2, 3, 4]
let a2 = [1, 1, 2, 3, 4] // number[]
type b1 = typeof a1 // readonly [1, 1, 2, 3, 4]
type b2 = typeof a2 // number[]
type c1 = b1['length'] // 5
type c2 = b2['length'] // number
元组类型在获取其长度时,返回的是具体长度,而数组类型获取长度时只会返回 number
,这就是区分二者的最大区别。