关键字在 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>; // number
type Str = GetReturnType<(x: string) => string>; // string
type Bools = GetReturnType<(a: boolean, b: boolean) => boolean[]>; // boolean[]