Typescript 类型体操与关键字extends

去掉字符串前后空格 Trim

type TrimLeft<T extends string> = T extends ` ${infer K}` ? TrimLeft<K> : T;
type TrimRight<T extends string> = T extends `${infer K} ` ? TrimRight<K> : T;
type Trimed = TrimLeft<TrimRight<'  Hello World  '>>;

const a: Trimed = 'Hello World';
console.log(a);

字符串替换 Replace

type Replace<S extends string, O extends string, T extends string> = S extends `${infer L}${O}${infer R}`
  ? Replace<`${L}${T}${R}`, O, T>
  : S;

const b: Replace<'12345', '4', 'aaa'> = '123aaa5';
console.log(b);

递归创建指定数组 CreateArray

type CreateArray<T, L extends number, Arr extends T[] = []> = Arr['length'] extends L
  ? Arr
  : CreateArray<T, L, [T, ...Arr]>;
const c: CreateArray<{ name: 222 }, 2, [{ name: 222 }]> = [{ name: 222 }, { name: 222 }];
console.log(c);

指定长度的数组类型 CreateArrayByLength

type Arr<T, L extends number> = [T, ...Array<T>] & { length: L };

const d: Arr<{ name: '222' } | string, 3> = [{ name: '222' }, { name: '222' }, '1111'];
console.log(d);

数组值的类型----ReturnArrElementType-1

type MyArray = [string, number, boolean];
type ReturnArrElementType = MyArray[keyof MyArray & number];
const gg: ReturnArrElementType = '123';
console.log(gg);

数组值的类型----ReturnArrElementType-2

type ReturnArrElementType = {
  [K in keyof MyArray]: MyArray[K];
}[number];
const hh: ReturnArrElementType = '123';
console.log(hh);

对象值的类型 ReturnObjValType

type MyObj = {
  name: string;
  gg: boolean;
  ss: 123;
  age: number;
};
type ReturnObjValType = MyObj[keyof MyObj];
const ii: ReturnObjValType = false;
console.log(ii);

extends 关键字

有两种用法:

  1. 类继承:用于表示类之间的继承关系,子类继承父类的属性和方法。
  2. 类型关系:用于表示类型之间的关系,一个类型是否是另一个类型的子类型。

两个例子:

type A = {name:string;age:number} extends {name:string} ? true : false;
type B = 'a' extends 'a'|'b' ? true : false;

第一个例子中{name:string;age:number} 表示一个对象类型,它包含 nameage 两个属性。{name:string} 也表示一个对象类型,但它只包含 name 属性。extends 关键字在这里的作用是判断左边的类型是否是右边的类型的子类型。由于左边的类型包含右边的类型的所有属性,因此左边的类型是右边的类型的子类型。因此,A 的类型是 true

第二个例子中'a' 是一个字符串字面量类型,它只包含一个值 'a''a'|'b' 是一个联合类型,它包含两个字符串字面量类型 'a''b'extends 关键字在这里的作用是判断左边的类型是否是右边的类型的子类型。由于 'a''a'|'b' 中的一个,因此左边的类型是右边的类型的子类型。因此,B 的类型是 true

总之,extends 关键字在 TypeScript 中可以用于表示类之间的继承关系,也可以用于表示类型之间的关系。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • TypeScript 类型挑战 Medium [[toc]] 项目地址 Github[https://github...
    binyu1231阅读 3,793评论 0 0
  •   引用类型的值(对象)是引用类型的一个实例。   在 ECMAscript 中,引用类型是一种数据结构,用于将数...
    霜天晓阅读 4,778评论 0 1
  • 1、概述 1、简介 JavaScript 语言的每一个值,都属于某一种数据类型. JavaScript 的数据类型...
    Qingelin阅读 3,663评论 0 0
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,455评论 0 4
  • 注释 单行注释和多行注释 kotlin和java一样支持当行(// 注释内容)和多行注释(/* 注释内容 */),...
    0246eafe46bd阅读 2,241评论 0 0