TypeScript 类型体操练习(一)

本文介绍了如何在TypeScript中使用Pick接口选择类型属性,实现Readonly使属性只读,元组转对象,数组索引访问的联合类型处理,以及诸如Exclude、Awaited、If、Concat、Includes、Push、Unshift和Parameters等类型操作的实现。
摘要由CSDN通过智能技术生成

实现 Pick

Pick工具类型通过从 Type 中选取一组属性 Keys(字符串字面或字符串字面的并集)来构造一个新的类型。

 interface Todo {
     title: string;
     description: string;
     completed: boolean;
 }
 type MyPick<T, K extends keyof T> = {
     [k in K]: T[k];
 };

 type P = MyPick<Todo,'title'|'completed'>

实现Readonly

将对象类型中的属性变为只读的

type MyReadonly<T> = {
    readonly [k in keyof T]: T[k];
};

元组转换成对象

 const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const;

 type TupleToObject<T extends ReadonlyArray<string | number>> = {
     [k in T[number]]: k
 };

 type result = TupleToObject<typeof tuple>;

数组索引访问将值的类型变成联合类型

First of Array

 type arr1 = ['a', 'b', 'c'];
 type arr2 = [3, 2, 1];

 type First<T extends any[]> = T extends [] ? never : T[0];
 //answer2
 type First<T extends any[]> = T['length'] extends 0 ? never : T[0]
 //answer3
 type First<T extends any[]> = T extends [infer A, ...infer rest] ? A : never

元组的长度

 type Length<T extends ReadonlyArray<any>> = T['length'];

 type teslaLength = Length<tesla> // expected 4
 type spaceXLength = Length<spaceX> // expected 5

实现内置的 Exclude<T, U> 类型

从联合类型 T 中排除 U 中的类型,来构造一个新的类型。

 type MyExclude<T, U> = T extends U  ? never : T;

 type Result = MyExclude<'a' | 'b' | 'c', 'a'>;

Awaited 实现

假如我们有一个 Promise 对象,这个 Promise 对象会返回一个类型。在 TS 中,我们用 Promise 中的 T 来描述这个 Promise 返回的类型。

type MyAwaited<T extends Thenable<any> | Promise<any>> =
T extends Promise<infer Inner>
? Inner extends Promise<any>
   ? MyAwaited<Inner>
   : Inner
: T extends Thenable<infer U>
? U
: false;

type Result2 = MyAwaited<ExampleType>;

IF 实现

实现一个 IF 类型,它接收一个条件类型 C ,一个判断为真时的返回类型 T ,以及一个判断为假时的返回类型 F。 C 只能是 true 或者 false, T 和 F 可以是任意类型。

type If<C extends boolean, T, F> = C extends true ? T : F;

type A = If<true, 'a', 'b'>;

Concat 实现

在类型系统里实现 JavaScript 内置的 Array.concat 方法,这个类型接受两个参数,返回的新数组类型应该按照输入参数从左到右的顺序合并为一个新的数组。

type Concat<T extends any[], U extends any[]> = [...T,...U];

type Result = Concat<[1,5], [2]>;

Includes 实现

在类型系统里实现 JavaScript 的 Array.includes 方法,这个类型接受两个参数,返回的类型要么是 true 要么是 false。

// 方式1
type Includes<T extends any[], U> = U extends T[number] ? true : false;
type isPillarMen = Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'kio'>; // expected to be `false

// 方式2
type Includes<T extends readonly any[], U> = { [P in T[number]]: true; }[U] extends true? true : false;

type isPillarMen = Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'kio'>; // expected to be `false`

Push 的实现

在类型系统里实现通用的 Array.push。

type Push<T extends unknown[], U> = [...T, U];

type Result = Push<[1, 2], '3'>; // [1, 2, '3']

Unshift的实现

在类型系统里实现通用的 Array.unshift的实现

type Unshift<T extends unknown[], U> = [U, ...T];

type Result = Unshift<[1, 2], 0>; // [0, 1, 2,]

Parameters实现

从函数类型 Type 的参数中使用的类型构造元组类型。

const foo = (arg1: string, arg2: number): void => {};

type MyParameters<T> = T extends (...arg: infer P) => any ? P : never;

type FunctionParamsType = MyParameters<typeof foo>;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值