为什么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
}
<T extends object>(base: T)
意味着base
属于通用类型T
。
TypeScript的类型系统还不了解泛型类型。 (#10727)
解决方法:
...
Flow报告您的代码没有错误:
/* @flow */
function aFunction<T: Object>(base: T) {
const anObject = { test:"value" }
if (typeof base !== 'object') { return }
const merged = { ...base, anObject }
return merged
}
目前,仿制药尚不支持传播和休息。
在第一个片段基础是type T
,它继承自object。嗯,你知道在javascript它不是一个强大的关系,因此不是一个is a
关系所以T不一定是object
。 T只是原型继承自object.Also typescript对泛型不了解。所以不支持传播。
在代码片段2中,base
是对象类型,但是typescript支持对象传播和解构。对象类型的值可以被传播。这个特征主要用于制作对象的副本。所以这就是它没有给出错误的原因。