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
}
4

3 回答 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
}
于 2017-07-29T03:05:11.660 回答
2

目前,泛型尚不支持传播和休息。

于 2017-07-29T03:05:45.130 回答
0

在第一个片段中,基础是type T从对象继承的。好吧,您知道在 javascript 中它不是强关系,因此不是is a关系,因此 T 不一定是object. T只是原型继承自对象。而且打字稿对泛型没有理解。所以不支持传播。

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

于 2017-07-29T03:06:55.683 回答