TypeScript如何避免属性不存在报错,实现属性全有或全无?
TypeScript 类型约束问题:对象全有或全无成员
我定义了如下 TypeScript 接口:
interface Foo { bar: string baz: number }
我需要确保对象要么包含所有成员,要么完全不包含。尝试用 type X = Foo | {} 时,访问属性会触发“property 'bar' does not exist on type X”的类型错误,但实际运行时访问会返回 undefined。我找到了一种可行写法:type X = Foo | { [k in keyof Foo]?: undefined },但这个写法比较复杂,遇到多类型联合的场景会更繁琐。
请问有没有更简洁的实现方式,不需要使用类型守卫或转换为 any?
使用 never 的尝试
有人建议用 Record<keyof Foo, never>,但不符合预期;而 Partial<Record<keyof Foo, never>> 在单类型示例中是有效的:
interface Foo { a: number } type X = Foo | Record<keyof Foo, never> const x: X = {} // 错误:Type '{}' is not assignable to type 'X'. console.log(x.a) type Y = Foo | Partial<Record<keyof Foo, never>> const y: Y = {} console.log(y.a)
多类型场景示例
我还测试了多类型联合的场景:
interface X { a: string b: string } interface Y { c: string d: string } type Z = X | Y | Partial<Record<keyof (X & Y), never>> // 以下赋值本应被禁止,但实际可以通过类型检查 const z: Z = {a: "x", b: "x", c: "x"} const z: Z = {a: "x", b: "x", c: "x", d: "x"}
发现即使只使用 X | Y 也存在这个问题,把接口换成 type 定义后情况依旧。想问这是不是当前能做到的最优实现?
内容的提问来源于stack exchange,提问作者kai
相关产品推荐
相关产品推荐

