与 Record<string, never> 的交集类型不允许属性访问

Xen*_*mar 8 typescript

我有点惊讶地发现:

type TypeA = Record<string, never> & { propA: string };

const a: TypeA = { // <- Type 'string' is not assignable to type 'never'
  propA: "lsjdf",
}
Run Code Online (Sandbox Code Playgroud)

在 TypeScript 中不起作用。我很想用Record<string, never>意味着“空对象”的东西替换,但无法想出表示空对象的类型。

我也很想了解为什么上述不起作用。

Con*_*Low 9

never意思是从不。

Record<string, never>意味着string类型访问器可以never有一个值”(尽管{ [Symbol()]: 'foobar' }是可能的)。YourTypeA无法使用,因为它产生了一个悖论:propA是一个string可以never存在的必需属性。签名是正确的,但类型之间没有可用的交集。

“空”有几个选项:

  • Record<string, never>是一个空对象,因为您无法向其添加任何字符串类型访问器属性(再次强调,除非您使用Symbol,因此它将始终为空
  • {}不指定任何属性,因此可以将任何类型分配给它,因为每种类型都满足所有零要求(除非该类型永远不能具有可访问的属性,即 和undefinednull。然而,虽然const foo: {} = 'bar'是可能的,{}但没有列出任何属性,因此如果没有转换/注释,您实际上无法使用它做任何事情。