为什么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
}
答案 0 :(得分:2)
<T extends object>(base: T)
表示base
属于通用类型T
。
TypeScript的类型系统还不了解泛型类型。 (#10727)
解决方法:
将您的代码重构为不使用...
等待#10727解决。
更改为其他类型的检查程序,例如,flow:
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支持对象传播和解构。对象类型的值可以传播。这个特征主要用于制作对象的副本。所以这就是为什么它没有错误。