awesome-typescript icon indicating copy to clipboard operation
awesome-typescript copied to clipboard

「重学TS 2.0 」TS 练习题第八题

Open semlinker opened this issue 4 years ago • 11 comments
trafficstars

第八题

定义 NonEmptyArray 工具类型,用于确保数据非空数组。

type NonEmptyArray<T> = // 你的实现代码

const a: NonEmptyArray<string> = [] // 将出现编译错误
const b: NonEmptyArray<string> = ['Hello TS'] // 非空数据,正常使用

提示:该题目有多种解法,感兴趣小伙伴可以自行尝试一下。 请在下面评论你的答案。

semlinker avatar Sep 14 '21 15:09 semlinker

//貌似也能用
type NonEmptyArray<T> = T[]["length"] extends 0 ? never : T[];

sunboyZgz avatar Sep 15 '21 06:09 sunboyZgz

8.1 解法一

type NonEmptyArray<T> = [T, ...T[]]

8.2 解法二

type NonEmptyArray<T> = T[] & { 0: T };

semlinker avatar Sep 16 '21 01:09 semlinker

type NonEmptyArray<T> = // 你的实现代码

const a: NonEmptyArray<string> = [] // 将出现编译错误
const b: NonEmptyArray<string> = ['Hello TS'] // 非空数据,正常使用
type NonEmptyArray<T> = {
  [P in number]: T;
} & {
  0: T
};

winfa avatar Sep 22 '21 15:09 winfa

type NonEmptyArray<T> = {
    [P in (keyof T[] & 0)]: P extends number ? T : T[][P]
}

// 测试用例
const a: NonEmptyArray<string> = [] // 将出现编译错误
const b: NonEmptyArray<string> = ['Hello TS'] // 非空数据,正常使用

Mrlgm avatar Sep 25 '21 16:09 Mrlgm

// 定义 NonEmptyArray 工具类型,用于确保数据非空数组。

type NonEmptyArray<T> = [T, ...T[]];

const a: NonEmptyArray<string> = [] // 将出现编译错误
const b: NonEmptyArray<string> = ['Hello TS'] // 非空数据,正常使

[T, ...T[]] 确保了第一项一定是T, 代码简洁的同时还易于理解

zhaoxiongfei avatar Oct 01 '21 14:10 zhaoxiongfei

// 22.3.11 - Learn // 解法1 type NonEmptyArray<T> = { 0: T } // 解法2 type NonEmptyArray<T> = [T, ...T[]]

const a: NonEmptyArray = [] // 将出现编译错误 const b: NonEmptyArray = ['Hello TS'] // 非空数据,正常使用

waleiwalei avatar Mar 11 '22 07:03 waleiwalei

// type NonEmptyArray<T> = [T,...T[]]// 你的实现代码


type NonEmptyArray<T> = {
    [P in  number] : T
} & {0 : T}

const a: NonEmptyArray<string> = [] // 将出现编译错误
const b: NonEmptyArray<string> = ['Hello TS']// 非空数据,正常使用

YJCCreateAHistory avatar May 25 '22 12:05 YJCCreateAHistory

@zhaoxiongfei 在你的基础上补充了下:
type NonEmptyArray<T> = { [P in (keyof T[] & 0)]: P extends number ? T | undefined : T[][P] } const a: NonEmptyArray = [] // 将出现编译错误 const b: NonEmptyArray = ['Hello TS', 'Hello TS'] // 非空数据,正常使用 const C: NonEmptyArray = [,1,,1,] // 含空数组

Bo-Teng avatar May 26 '22 03:05 Bo-Teng

8.1 解法一

type NonEmptyArray<T> = [T, ...T[]]

8.2 解法二

type NonEmptyArray<T> = T[] & { 0: T };

这个& {0: T}啥意思啊,代表T[0]的类型是T类型?可以这么写吗

guo897654050 avatar Jul 04 '22 12:07 guo897654050

// type NonEmptyArray<T> = [T,...T[]]// 你的实现代码


type NonEmptyArray<T> = {
    [P in  number] : T
} & {0 : T}

const a: NonEmptyArray<string> = [] // 将出现编译错误
const b: NonEmptyArray<string> = ['Hello TS']// 非空数据,正常使用

这样写键是number类型的对象也是可以的

ZHAOLIMIN1997 avatar Oct 13 '22 10:10 ZHAOLIMIN1997

//<数组类型T>,T[]定义内容需要是数组,{0:T}定义第一项数据类型为T以此保证不为空
type NonEmptyArray<T> = T[] & {0:T};
//元祖定义,定义第一项必须存在且类型为T;...T[]为元祖的剩余元素定义,定义可有任意个T类型元素
type NonEmptyArray<T> = [T,...T[]]

//const a: NonEmptyArray<string> = []// 出现编译错误
const b: NonEmptyArray<string> = ['Hello TS'] // 非空数据,正常使用

shiyicyh avatar Aug 21 '23 05:08 shiyicyh