为什么打字稿抱怨对象必须是传播类型中的对象

Why does typescript complain that an object must be an object in spread types

为什么 TSC 说“...base”必须是一个对象,我该如何解决这个问题同时仍然保留 "base" 对象的类型。

function aFunction<T extends object>(base: T) {
  const anObject = { test:"value" }
  if (typeof base !== 'object') { return }

// the following line causes a TSC error, saying that spread types can only be
// created from object types and highlighting base as the problem...  wut?

  const merged = { ...base, anObject }
  return merged
}

例如,下面没有编译器错误但是丢失了 'base'.

的所有类型信息
function aFunction(base: object) {
  const anObject = { test:value }
  if (typeof base !== 'object') { return }

  const merged = { ...base, anObject }
  return merged
}

<T extends object>(base: T) 表示 base 是泛型 T.

而且 TypeScript 的类型系统还不理解泛型类型。 (#10727)

解决方法:

  1. 重构您的代码以不使用 ...

  2. 等待#10727解决

  3. 改成其他类型检查器,例如flow:

Flow 报告您的代码没有错误:

/* @flow */

function aFunction<T: Object>(base: T) {
  const anObject = { test:"value" }
  if (typeof base !== 'object') { return }

  const merged = { ...base, anObject }
  return merged
}

目前泛型尚不支持 spread 和 rest。

在第一个代码片段中,基础是 type T,它继承自对象。嗯,你知道在 javascript 中它不是强关系,因此不是 is a 关系,所以 T 不一定是 object。 T 只是原型继承自 object.Also typescript 不理解 generics.So 不支持传播。

在代码片段 2 中,base 是对象类型,但打字稿支持对象传播和结构化。对象类型的值可以是 spread.this 功能主要用于复制 objects.So 这就是它没有给出错误的原因。