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

问题描述 投票:3回答:3

为什么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
}
typescript object merge spread-syntax
3个回答
2
投票

<T extends object>(base: T)意味着base属于通用类型T

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

解决方法:

  1. 重构你的代码不使用...
  2. 等待#10727得到解决。
  3. 更改为其他类型的检查器,例如,流程:

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

/* @flow */

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

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

2
投票

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.