semlinker/awesome-typescript

「重学TS 2.0 」TS 练习题第十六题

semlinker opened this issue · 19 comments

实现一个 Push 工具类型,用于把指定类型 E 作为第最后一个元素添加到 T 数组类型中。具体的使用示例如下所示:

type Push<T extends any[], V> = // 你的实现代码

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]

请在下面评论你的答案。

type Push<T extends any[], V> = T extends [...infer U] ? [...U, V] : never;

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4
//使用11题的isEqual
type Includes<T extends Array<any>, E> = T extends [infer A, ...infer B]
  ? IsEqual<A, E> extends true
    ? true
    : Includes<B, E>
  : false;

type I0 = Includes<[], 1>; // false
type I1 = Includes<[2, 2, 3, 1], 2>; // true
type I2 = Includes<[2, 3, 3, 1], 1>; // true

你的答案串题了 @sunboyZgz

type Push<T extends any[], V> =  [...T, V];

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]
type Push<T extends any[], V> = T extends [...infer Args] ? [ ...Args, V] : never// 你的实现代码

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]
type Push<T extends any[], V> = [...T, V] // 你的实现代码

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]

type Push<T extends any[], V> = [...T, V]
type ArrP0 = Push<[], 1> // [1]
type ArrP1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]

Mrlgm commented
type Push<T extends any[], V> = [...T, V]

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]
winfa commented
ype Push<T extends any[], V> = // 你的实现代码

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]
type Push<T extends any[], V> = [...T, V]

// 实现一个 Push 工具类型,用于把指定类型 E 作为第最后一个元素添加到 T 数组类型中。具体的使用示例如下所示:
type Push<T extends any[], V> = [...T, V];

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]

着眼点在数组的形状上,直接构造。省去乱七八糟的东西

type Push<T extends any[], V> = [...T, V]

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]

export default {}

// 实现一个 Push 工具类型,用于把指定类型 E 作为第最后一个元素添加到 T 数组类型中。具体的使用示例如下所示:
type Push<T extends any[], V> = [V, ...T]

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]

type Push<T extends any[], V> = [...T, V];

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]

type Push<T extends any[], V> = [...T, V]

type Push<T extends any[], V> = T extends [...infer R] ? [...R, V] : T

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]
type Push<T extends any[], V> =
  T extends [...infer Arr]
    ? [...Arr, V]
    : []

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]
// 解法1: 直接扩展运算符
type Push<T extends any[], V> = [...T, V]

// 解法2: 使用infer指代源数组来扩展
type Push1<T extends any[], V> = T extends [...infer K] ? [...K, V] : []
type Push<T extends any[], V> = [...T, V] // 你的实现代码

// 测试用例
type Arr0 = Push<[], 1> // [1]
type Arr1 = Push<[1, 2, 3], 4> // [1, 2, 3, 4]
type Push<T extends any[], V> = [...T, V]; // 你的实现代码

// 测试用例
type Arr0 = Push<[], 1>; // [1]
type Arr1 = Push<[1, 2, 3], 4>; // [1, 2, 3, 4]
LLDLZ commented
type Push<T extends any[], V> = [...T, V];

// 测试用例
type TestArr0 = Push<[], 1>; // [1]
type TestArr1 = Push<[1, 2, 3], 4>; // [1, 2, 3, 4]