起因
最近在 Astro 项目开发时自动提示出这样一段代码:
ts
export const getStaticPaths = (() => {
return []
}) satisfies GetStaticPaths
按照以前我可能会这样去写:
ts
export const getStaticPaths: GetStaticPaths = () => {
return []
}
这不经使我好奇,satisfies
是什么东西,为什么要这样去声明类型,这样做有哪些好处?
调查
satisfies
运算符是 TypeScript v4.9 新增的运算符,可以验证表达式的类型是否与某种类型匹配,而无需更改该表达式的结果类型1。
这是什么意思呢,举个例子:
ts
type User = {
id: string
job: string | boolean
}
const mk = {
id: 'uf193',
job: 'chef',
} as User
mk.job.toUpperCase()
这里会报错:Property 'toUpperCase' does not exist on type 'string | boolean'
。所以在调用 toUpperCase
之前,需要先判断 job
的类型:
ts
if (typeof mk.job === 'string') {
mk.job.toUpperCase()
}
或者使用 as
对 job
进行断言:
ts
(mk.job as string).toUpperCase()
如果使用 satisfies
运算符,就可以解决这个问题:
ts
const mk = {
id: 'uf193',
job: 'chef',
} satisfies User
此时,mk.job
的类型就是 string
,它是根据实际的值进行了类型推导的。
让我们再看一个例子:
ts
type Keys = 'id' | 'email' | 'birth'
const obj = {
id: '81920',
email: '[email protected]',
birth: 1990,
} satisfies Record<Keys, string | number>
这样可以对对象的属性名称或者是对象的所有属性值的类型进行检查。