关键字在 TypeScript 中具有特定的含义,用于定义类型、类、接口、函数等。例如,number、string、boolean 是 TypeScript 中的关键字,用于声明基本类型。同时,还有其他关键字如 interface、class、enum、function 、extends、in、keyof 和 typeof 等等。
基础的类型这里不展开讲,我们来说下其他比较特殊的关键字用法。
extends
extends
顾名思义就是继承,常用的场景有类型继承、条件类型、类型约束
类型继承
类型继承指的是一种类型之间的关系,其中一个类型(称为子类型)可以继承另一个类型(称为父类型)的属性和方法。通过类型继承,可以创建更复杂的类型层次结构,便于重用代码和定义更具体的行为。
interface People { name: string; age: number;}const people: People = { name: 'Kelen', age: 25,};interface Developer extends People { skills: string[];}const developer: Developer = { name: 'Kelen', age: 25, skills: ['Javascript', 'Typescript'],};
条件类型
使用 extends 关键字可以根据给定的类型条件来确定最终的类型。
// 如果 T 可以满足类型 Person 则返回 Person 类型,否则为 T 类型type IsPerson<T> = T extends Person ? Person : T;
类型约束
类型约束是一种在类型系统中进行条件判断的机制,用于判断一个类型是否符合某些条件。
type People = { name: string; age: number;};function getAttr<T extends People>(people: T) { return people.name;}// 报错 Property 'age' is missing in type '{ name: string; }' but required in type 'People'getAttr({ name: 'kelen' });// 下面都是可以的getAttr({ name: 'kelen', age: 12 });getAttr({ name: 'kelen', age: 12, height: 20 });
keyof 操作符
使用 keyof
操作符可以获取一个对象类型的所有 key 或 数字字面量组合的联合类型。
type Person = { name: string; age: number; heigh: number; weigh: number;};type Keys = keyof Person; // 'name' | 'age' | 'heigh' | 'weigh'
typeof 操作符
typeof
主要用于对类型上下文进行判断,可以使用 typeof
创建一个新的类型。
const name: string = 'kelen';const name2: typeof name = 'kelen2'; // 相当于 const name2: string = 'kelen2'const person = { name: name, age: 18,};type Person = typeof person;const person2: Person = { name: name2, age: 18,};
infer 关键字
TypeScript 中的 infer
关键字用于在类型推断中提取类型。它可以方便地从一个类型中提取出一个新的类型,这样就可以在类型谓词中使用这个新的类型了。
使用 infer
关键字可以在类型推断中提取出某个类型,这样可以在不显式指定类型的情况下让 TypeScript 自动推断出正确的类型,提高代码的可读性和可维护性。比如提取函数返回值的类型。
type GetReturnType<T> = T extends (...args: never[]) => infer Return ? Return : never;type Num = GetReturnType<() => number>; // numbertype Str = GetReturnType<(x: string) => string>; // stringtype Bools = GetReturnType<(a: boolean, b: boolean) => boolean[]>; // boolean[]