type-challenges:IsTuple

25 阅读1分钟

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,这就是区分二者的最大区别。