关于satisfies

关于satisfies

TypeScript 中变量的类型有两种,一种是手动声明的,一种是自动推导的。

自动推导

 let abc = {
   a: 1,
   b: "1",
 } 
 
// 类型:
// abc: {
//    a: number;
//    b: string;
//	}

好处:

  1. 确定实际的属性名字和属性类型;
  2. 编辑器会提示实际属性

缺点:

  1. 不能做属性名扩展(可以使用 as 类型推断,但是在编译阶段,可能会使用(或输入错误)没有定义的属性名,没有报错);
  2. 不能做属性类型扩展( 如希望 b的类型可以是string和number ,或者满足特定类型约束)

手动声明

type obj = {
  a: number,
  b: string|number,
  [key:string]:any
} 

let abc:obj = {
  a: 1,
  b: "1",
  cc:1
} 

// abc:obj

好处:

  1. 能做属性名扩展;
  2. 能做属性类型扩展(如b的类型可以是string和number,或者满足特定类型约束);

坏处:

  1. 不确定实际的属性名字和属性类型(TS可以编译成功,实际使用可能使用错误的属性)
  2. 编辑器只能提示声明的属性名,不能提示扩展的属性名字;

satisfies

官方的说法,它用于在确保某些表达式某种类型匹配的同时保留该表达式的最特定类型以进行推理

个人理解:变量类型依然使用自动推导,只是推导的类型必须满足特定类型,保证类型安全

type obj = {
  a: number,
  b: string|number,
  [key:string]:any
} 

let abc = {
  a: 1,
  b: "1",
  cc:1
} satisfies obj


// 类型
// abc: {
//   a: number;
//   b: string;
//   cc: number;
// }

好处

  1. 限定推导的类型必须符合特定类型,且推导的类型为实际类型;
  2. 因为是实际类型,所以不存在使用时,调用了未知的属性名;
  3. 编辑器能提示实际所有的属性名;

缺点:

  1. 不能做属性名扩展,因为推导出来的类型为实际类型;

总结

让你用自动推导出的类型,而不是声明的类型,增加灵活性,同时还可以对这个推导出的类型做类型检查,保证安全。

自动推导和手动声明,各有优势不能两全其美。

所以 ts 加入了 satisfies 的语法,这样就可以用自动推导出的类型(实际类型)了,它也可以加上类型的约束(对推导的实际类型做类型约束)

posted @   CD、小月  阅读(28)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示