ts 获取确定数组的每一项的值

233 阅读1分钟

方法1

type A = [10,22,5,'abcd']

type Index<T, index> = T extends (string | number)[] ? index extends number ?  T[index] : never : never;
 type j =   Index<A, 2>
const a: j=2

方法2

// 可以使用TS的索引类型和映射类型来实现这个工具方法,如下所示:

// typescript
type ArrayItem<T> = T;

type ArrayMap<T extends any[]> = {
  // [K in keyof T]: K;
  // [K in keyof T]: K;
  [K in keyof T]:T[K]
};

type GetArrayItem<T extends any[], K extends keyof T> = ArrayMap<T>[K]
// ```

// 这段代码中,首先定义了一个`ArrayItem`类型,它是一个条件类型,用于获取数组中的元素类型。然后定义了一个`ArrayMap`类型,它是一个映射类型,用于将数组中的元素映射为一个包含相应类型的新数组类型。最后定义了一个`GetArrayItem`类型,它根据传入的数组和索引键获取对应的元素类型,如果索引键不合法则返回`never`类型。
//
// 使用这个工具方法,我们可以对任意长度的数组进行索引,如下所示:

type A = [10, 22, 5, 'abcd'];

type B = [boolean, string, number];

type fft = ArrayMap<A>;
type ff = GetArrayItem<A, 3>;
type ArrayMap<T extends any[]> = {
  // [K in keyof T]: K;
  // 为了防止索引溢出
  [K in keyof T]: K extends string ? T[K]: never
};

这里有一个方法没有搞懂 为什么 K 是 extends 的 string 而 extends number 就不可以?