牢騷百物語

author Caisr
created_at 2025-03-05 15:33:26
updated_at 2025-03-05 13:01:05

TypeScript - satisfies

我在 JavaScript 分类中放一些 TypeScript 的笔记大家没意见吧

notes cover

使用过 TypeScript 的人一定遇到过以下情况:

type Item = {
amount: number | string;
};
const item: Item = {
amount: '3.14',
};
// 会报错
// Argument of type 'string | number' is not assignable to parameter of type 'string'.
// Type 'number' is not assignable to type 'string'.
console.log(parseFloat(item.amount));

原因是 TypeScript 认为这个字段有可能是 string 类型,也有可能是 number 类型,而 parseFloat 方法只接受 string 类型,所以你不得不进行一次类型转换或者用 as

console.log(parseFloat(`${item.amount}`));
console.log(parseFloat(item.amount as string));

这也是很多人觉得 TypeScript 麻烦的地方,为了类型正确不得写很多看起来多此一举的代码,但是我个人觉得是保证程序正常运行的必要手段,虽然我有时候也会偷懒用 as

现在不一样了 satisfies 可以完美解决上述问题,satisfies 可以让 TypeScript 自适应类型。

type Item = {
amount: number | string;
};
const item = {
amount: '3.14',
} satisfies Item;
// 这里不会报错
console.log(parseFloat(item.amount));

假如你改变了 amount 的类型:

const item = {
amount: 3.14,
} satisfies Item;
console.log(Math.floor(item.amount));

TypeScript 也能推断出 amount 是 number 类型。

MADAO开花观察日记

说来好笑,我是在探索 ai-chatbot 项目源码的时候偶然发现这个语法的。以前我是”源码恐惧症”重度患者,一看到源码就头大,觉得那就是天书(其实是我太菜了)。但是不得不说,读源码简直就像挖宝藏一样,每次都能发现新的知识瑰宝。所以…我正式宣布:我要叛变了!从今天起,我是“阅读源码星人”了,哈哈哈哈

陇ICP备2021003360号-1 record icon

甘公网安备 62042302000165号