本文为翻译作品,原文: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 使用有所帮助。