为什么typescript抱怨对象必须是排列类型中的对象

为什么typescript抱怨对象必须是排列类型中的对象,typescript,object,merge,spread-syntax,Typescript,Object,Merge,Spread Syntax,为什么TSC说“…base”必须是一个对象,我如何在保留“base”对象的类型的同时解决这个问题 (base:T)表示base属于泛型T TypeScript的类型系统还不理解泛型类型。 () 解决办法: 重构代码,使其不使用… 等待解决 更改为其他类型检查器,例如流: Flow报告您的代码没有错误: /* @flow */ function aFunction<T: Object>(base: T) { const anObject = { test:"value" }

为什么TSC说“…base”必须是一个对象,我如何在保留“base”对象的类型的同时解决这个问题

(base:T)
表示
base
属于泛型
T

TypeScript的类型系统还不理解泛型类型。 ()

解决办法:

  • 重构代码,使其不使用

  • 等待解决

  • 更改为其他类型检查器,例如流:

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

    /* @flow */
    
    function aFunction<T: Object>(base: T) {
      const anObject = { test:"value" }
      if (typeof base !== 'object') { return }
    
      const merged = { ...base, anObject }
      return merged
    }
    
    /*@flow*/
    函数A函数(基:T){
    const anObject={test:“value”}
    if(typeof base!=“object”){return}
    const merged={…base,anObject}
    返回合并
    }
    
    目前泛型还不支持Spread和rest

    第一个代码段中的是从object继承的
    类型T
    。您知道,在javascript中,它不是一个很强的关系,因此不是一个
    关系,所以T不一定是一个
    对象。不仅仅是原型继承自对象。而且typescript不理解泛型。所以不支持扩展


    在代码片段2中,
    base
    是object类型,但typescript支持对象扩展和分解。object类型的值可以扩展。此功能主要用于复制对象。因此它不会出现错误。

    这只是typescript作为#10727的一个弱点。非常感谢,是否有一种建议的方式来合并typescript中的对象,以保留类型信息?我已经进行了重构,以断言对象,这是可行的,只是感觉相当粗糙。const merged={…base,anObject}@laramie我不知道怎么做。我会使用
    Object.assign
    作为解决方法。
    function aFunction(base: object) {
      const anObject = { test:value }
      if (typeof base !== 'object') { return }
    
      const merged = { ...base, anObject }
      return merged
    }
    
    /* @flow */
    
    function aFunction<T: Object>(base: T) {
      const anObject = { test:"value" }
      if (typeof base !== 'object') { return }
    
      const merged = { ...base, anObject }
      return merged
    }