Skip to content

satisfies 操作符

satisfies 是 TypeScript 4.9 引入的一个新操作符,用于在编译时检查一个表达式的类型是否符合指定的类型,但不会像传统的类型断言那样改变表达式的类型。它主要用于确保代码符合预期的类型结构,同时保持更精确的类型推断。

主要用途

  • 类型兼容性检查:确保一个值或对象的结构符合某个接口或类型定义,而不改变其具体类型。
  • 保留更具体的类型信息:与类型断言不同,satisfies 不会将表达式转换为指定的类型,而是保留了表达式的原始类型信息,同时确保它满足指定的类型约束。
  • 提高类型安全性:通过显式地验证表达式是否符合预期类型,可以减少潜在的类型错误。

基本语法

typescript
const value = expression satisfies Type;

在这个例子中,expression 必须是符合 Type 类型的,否则编译器会报错。但是,value 的类型仍然是 expression 的实际类型,而不是 Type

比较as

特性satisfiesas
功能编译时类型兼容性检查类型断言
是否改变类型不改变,保留原始类型改变,强制转换为目标类型
安全性更高,保留更多类型信息,减少错误较低,可能绕过类型检查,引入错误
灵活性允许额外属性,只要符合基本要求严格遵循指定类型
使用场景确保表达式符合预期类型的同时保留具体类型信息当你需要明确地告诉编译器某个值的具体类型

示例解析

示例 1: 确保对象符合接口

假设我们有一个接口 User

typescript
interface User {
  id: number;
  name: string;
}

const user = {
  id: 1,
  name: "Alice",
  age: 30, // 这个属性不是 User 接口的一部分
} satisfies User;

// user 的类型是 { id: number; name: string; age: number }

在这个例子中,user 对象不仅包含 User 接口中定义的 idname 属性,还额外包含了 age 属性。使用 satisfies 操作符后,user 的类型仍然是 { id: number; name: string; age: number },但它同时也被验证为符合 User 接口的要求。如果你移除 age 属性,user 的类型将准确地匹配 User 接口。

示例 2: 确保函数签名符合接口

typescript
type AddFunction = (a: number, b: number) => number;

const add = ((a: number, b: number) => a + b) satisfies AddFunction;

// add 的类型是 (a: number, b: number) => number

在这个例子中,add 函数被验证为符合 AddFunction 类型,但它的类型仍然是 (a: number, b: number) => number

示例 3: 确保枚举值符合类型

typescript
type Status = "active" | "inactive";

const status = "active" satisfies Status;

// status 的类型是 "active"

在这个例子中,status 被验证为符合 Status 类型,但它的类型仍然是 "active"

示例 4: 确保联合类型成员符合类型

typescript
type Color = "red" | "green" | "blue";

const colors = ["red", "blue"] satisfies Color[];

// colors 的类型是 ("red" | "blue")[]

在这个例子中,colors 数组中的每个元素都被验证为符合 Color 类型,但数组的具体类型是 ("red" | "blue")[]

优点

  • 保留更具体的类型信息:与类型断言不同,satisfies 不会改变表达式的类型,而是保留了更具体的类型信息。
  • 提高类型安全性:通过显式地验证表达式是否符合预期类型,可以减少潜在的类型错误。
  • 灵活性:允许对象或值包含额外的属性,只要它们至少符合指定的类型要求。

注意事项

  • 不能用于变量声明satisfies 只能用于初始化表达式,不能直接用于变量声明。
  • 不适用于运行时检查satisfies 是一个编译时操作符,只在编译时起作用,不影响运行时行为。

总结

satisfies 操作符是一个非常有用的工具,可以帮助你在编写代码时确保表达式的类型符合预期,同时保留更具体的类型信息。这不仅可以提高代码的安全性和可维护性,还可以使类型系统更加灵活和强大。

Released under the MIT License.