Typescript:对象无效。是否指定类型?

Typescript:对象无效。是否指定类型?,typescript,Typescript,为什么在Typescript 2.6.2中,Object.assign({},null)被键入为{}&null,而不仅仅是{} 如您所见,结果是两种类型的相交。因此,如果传入一个空对象{}和null,则得到交集类型{}&null null在对象中是允许的。assign基本上被忽略:对于任何非对象原语类型,都是如此。我很惊讶TS在这里刚刚回归工会。似乎需要一个语言级别的构造来过滤非对象类型。@LeeBensonobject.assign允许非对象类型(或采用“一切都是对象”的策略)对象。赋值(2,

为什么在Typescript 2.6.2中,
Object.assign({},null)
被键入为
{}&null
,而不仅仅是
{}

如您所见,结果是两种类型的相交。因此,如果传入一个空对象
{}
null
,则得到交集类型
{}&null


null
对象中是允许的。assign
基本上被忽略:

对于任何非对象原语类型,都是如此。我很惊讶TS在这里刚刚回归工会。似乎需要一个语言级别的构造来过滤非对象类型。@LeeBenson
object.assign
允许非对象类型(或采用“一切都是对象”的策略)<代码>对象。赋值(2,空)例如可以工作。是的,我理解。但在我看来,TS做的事情并不正确
Object.assign(2,null)
被键入为
2&null
,此时它只返回一个数字。联合在这里感觉不对劲。@LeeBenson这只是基于TS为
对象的参数创建联合类型。assign
。我不确定TypeScript是否有能力创建条件类型。无论如何,
null
作为交叉类型没有任何效果,因为
null
没有属性。单词“union”有一个特定的含义,与单词“intersection”不同(并具有双重含义)。“
T&U
”不是工会;这是一个有趣的部分。您如何确定如何键入
Object.assign({},null)
interface ObjectConstructor {
    assign<T, U>(target: T, source: U): T & U;
const sourceInstance = { a: 'b' };
const targetInstance = { c: 'd' };
Object.assign(sourceInstance, targetInstance); // { a: 'b', c: 'd' }