为什么typescript会抱怨对象必须是扩散类型中的对象

时间:2017-07-29 02:42:53

标签: typescript object merge spread-syntax

为什么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
}

例如,以下内容没有编译器错误,但丢失了&#39; base&#39;的所有类型信息。

function aFunction(base: object) {
  const anObject = { test:value }
  if (typeof base !== 'object') { return }

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

3 个答案:

答案 0 :(得分:2)

<T extends object>(base: T)表示base属于通用类型T

TypeScript的类型系统还不了解泛型类型。 (#10727

解决方法:

  1. 将您的代码重构为不使用...

  2. 等待#10727解决。

  3. 更改为其他类型的检查程序,例如,flow:

  4. Flow报告代码没有错误:

    /* @flow */
    
    function aFunction<T: Object>(base: T) {
      const anObject = { test:"value" }
      if (typeof base !== 'object') { return }
    
      const merged = { ...base, anObject }
      return merged
    }
    

答案 1 :(得分:2)

目前,仿制药尚不支持传播和休息。

答案 2 :(得分:0)

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

在代码片段中,base是object类型,但是typescript支持对象传播和解构。对象类型的值可以传播。这个特征主要用于制作对象的副本。所以这就是为什么它没有错误。