为什么打字稿抱怨对象必须是传播类型中的对象
Why does typescript complain that an object must be an object in spread types
为什么 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)
解决方法:
重构您的代码以不使用 ...
等待#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
}
目前泛型尚不支持 spread 和 rest。
在第一个代码片段中,基础是 type T
,它继承自对象。嗯,你知道在 javascript 中它不是强关系,因此不是 is a
关系,所以 T 不一定是 object
。 T 只是原型继承自 object.Also typescript 不理解 generics.So 不支持传播。
在代码片段 2 中,base
是对象类型,但打字稿支持对象传播和结构化。对象类型的值可以是 spread.this 功能主要用于复制 objects.So 这就是它没有给出错误的原因。
为什么 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)
解决方法:
重构您的代码以不使用
...
等待#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
}
目前泛型尚不支持 spread 和 rest。
在第一个代码片段中,基础是 type T
,它继承自对象。嗯,你知道在 javascript 中它不是强关系,因此不是 is a
关系,所以 T 不一定是 object
。 T 只是原型继承自 object.Also typescript 不理解 generics.So 不支持传播。
在代码片段 2 中,base
是对象类型,但打字稿支持对象传播和结构化。对象类型的值可以是 spread.this 功能主要用于复制 objects.So 这就是它没有给出错误的原因。