TypeScript中是否存在等效于不给对象属性赋值的表达式?
问题解答
报错原因说明
第一种写法报错原因
TypeScript的类型系统严格区分属性不存在和**属性值为undefined**两种场景:
你声明的foo类型为{ [key: string]: string },代表所有存在的属性的值都必须是string类型,不允许为undefined。你写的bar: bar ?? undefined等于明确为bar属性赋值了undefined,自然不符合类型约束。
第二种写法报错原因
never是纯类型层面的概念,仅存在于TypeScript的编译阶段,没有对应的JavaScript运行时值,所以不能直接作为值赋值给属性。
等效简化写法
你可以用条件展开对象的写法实现和原始if逻辑完全等效的效果,不需要修改foo的类型:
const foo: { [key: string]: string } = { ...(bar != null && { bar }) }
当bar为null或者undefined时,bar != null && { bar }会返回false,展开false到对象中不会产生任何属性,完全等价于从一开始就没有定义bar属性。
undefined和never的作用说明
undefined是JavaScript的原生基础值,代表已声明/定义的变量/属性没有被赋值,和「属性本身不存在」是完全不同的两个概念:比如调用Object.keys()时,值为undefined的属性会被纳入返回结果,不存在的属性则不会。never是TypeScript的底层类型,代表永远不可能出现的值的类型,典型使用场景包括永远不会返回的函数的返回值类型、联合类型中不可能命中的分支类型,它只在类型校验阶段生效,没有对应的运行时实体。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

