TypeScript satisfies

Feb-21, 2025 · 1min

TypeScript satisfies

使一个表达式符合某个类型,而不改变表达式的类型。

ts
type Colors = "red" | "green" | "blue";
type RGB = [red: number, green: number, blue: number];

const palette: Record<Colors, string | RGB> = {
  red: [255, 0, 0],
  green: "#00ff00",
  bleu: [0, 0, 255],
  // 这里会报错,因为 bleu 不是 Colors 类型
};

// 这里会报错,因为 palette.green 可能是 string 类型,也可能是 RGB 类型,而 string 类型没有 toUpperCase 方法
const greenNormalized = palette.green.toUpperCase();

使用 satisfies

ts
type Colors = "red" | "green" | "blue";
type RGB = [red: number, green: number, blue: number];

const palette = {
  red: [255, 0, 0],
  green: "#00ff00",
  bleu: [0, 0, 255],
  // 这里会报错,因为 bleu 不是 Colors 类型
} satisfies Record<Colors, string | RGB>;

// 这里不会报错,因为 palette.green 是 string 类型,有 toUpperCase 方法
const greenNormalized = palette.green.toUpperCase();

这里使用 satisfies 后,palette 符合 Record<Colors, string | RGB> 类型,并且保留了其原有的类型,所以这个推断 palette.green 是 string 类型

其他使用场景

确保对象的 keys 符合某个类型

ts
type Colors = "red" | "green" | "blue";

// 确保对象的 keys 符合 Colors 类型
const favoriteColors = {
  red: "yes",
  green: false,
  blue: "kinda",
  platypus: false,
  // 错误:platypus 没有在 Colors 类型中列出
} satisfies Record<Colors, unknown>;

// 所有关于 'red', 'green', 和 'blue' 属性的信息都被保留了,不是 unknown 类型
const g: boolean = favoriteColors.green;

确保对象的属性值符合某个类型

ts
type RGB = [red: number, green: number, blue: number];

// 确保对象的属性值符合 string 和 RGB 类型
const palette = {
  red: [255, 0, 0],
  green: "#00ff00",
  blue: [0, 0],
  // 错误:blue 的类型既不是 string 类型,也不是 RGB 类型
} satisfies Record<string, string | RGB>;

// 每个属性的信息仍然被保留。
const redComponent = palette.red.at(0); // red 是 RGB 类型
const greenNormalized = palette.green.toUpperCase(); // green 是 string 类型