TypeScript:五大高级特性全面解读

104 阅读3分钟

本文为翻译作品,原文:Top 5 Advanced TypeScript Features

TypeScript 是 JavaScript 的一个超集,用于健壮你的代码,以规避烦人的类型相关的错误。

今天,我将简要介绍 5 个高级 TypeScript 功能,以

  • 让你的代码更易读,
  • 让你的代码更易于维护……
  • 并最终极大提升你的开发体验。

不再废话…… 让我们马上深入了解。

as const

as const 将对象转换为“只读”或“不变”。

as const 适用于任何可变的 JavaScript 对象,包括具有嵌套属性的对象(不像 Object.freeze())。

下面是使用 as const 与不使用时,相同对象的类型比较。

// 不使用 'as const'
const x = {
    a: 1,
    b: 2
}
// const x: {
//    a: number;
//    b: number;
//}

// 使用 'as const'
const x = {
    a: 1,
    b: 2
} as const
// const x: {
//    readonly a: number;
//    readonly b: number;
//}

当你需要缩小类型范围时,这个功能非常有用,例如将字符串缩小为字面量。

satisfies

satisfies 用于定义 “具体” 的类型(类似于 as const,将对象转换为更具体的类型)。

下面是它的理论工作方式:

  • 声明一个满足特定类型的对象。
  • 用一些属性填充该对象。
  • 只能访问定义的属性。

现在来看一个比较 satisfies 和基本类型注释的例子:

// 不使用 'satisfies'
const scores: Record<string, number> = {}

// 有效!
// 因为类型尽可能宽泛,意味着可以添加任何具有正确类型的属性。
scores.english = 1
scores.maths = 2

// 使用 'satisfies'
const scores = {} satisfies Record<string, number>

// 错误:在向 'scores' 对象添加 'english' 和 'maths' 属性之前,不能直接添加属性。
scores.english = 1
scores.maths = 2

extends

extends 是一个非常多用途的关键字,具有许多使用场景。

它在构建条件类型时最为出色。

这里有一个使用 extends 的简单示例:

type x = String extends object ? true : false
// 这会返回 'true',因为 'String' 类型继承自 'object'

type y = string extends object ? true : false
// 'string' 是 'String' 的基本类型版本,因此不继承自 'object' 类型,因此这个表达式评估为 'false'。

infer

infer 关键字允许你使用条件类型表达式来“提取”类型。

因此,infer 必须在 extends 子句中作为一种“参数”使用。

下面是一个使用 infer 来“提取”特定 Record 的键类型的例子:

// 这是一个字符串和数字的 Record。我们想在这个案例中“提取”'keys'的类型。

// 更改 'string' 将改变 'ExtractKey' 的类型
const thisObject: Record<string, number> = {
    "x": 1,
    "y": 2
}

// 我们检查 'thisObject' 的类型是否符合推断类型 'x' 和 'number' 的 Record 形式。如果是这样,则“提取”那个推断类型,否则返回类型 'never'。
type ExtractKey = typeof thisObject extends Record<infer x, number> ? x : never

泛型

大多数人觉得泛型令人生畏,但它们实际上非常直观。

泛型简单来说就是参数化的类型。

泛型类型的语法如下所示:

// 注意:约定是将 'GenericParameter' 标记为 'T', 'U'...
// 在这个案例中,为了清晰,我将其标记为 'GenericParameter'。
type GenericType<GenericParameter> = {
  x: GenericParameter
}

感谢阅读本文,希望理解这些高级功能对你的 TypeScript 使用有所帮助。