2017-07-29 73 views
2

为什么TSC会说“... base”必须是一个对象,我该如何解决这个问题,同时仍然保留“base”对象的类型。为什么typecript会抱怨对象必须是传播类型的对象

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 
} 

回答

2

<T extends object>(base: T)装置base是一个通用型T的。

而TypeScript的类型系统还不了解泛型。 (#10727

解决方法:

  1. 重构代码,不使用...

  2. 等待#10727得到解决。

  3. 更改为其他类型检查,例如,流程:

流程报表上你的代码中没有错误:

/* @flow */ 

function aFunction<T: Object>(base: T) { 
    const anObject = { test:"value" } 
    if (typeof base !== 'object') { return } 

    const merged = { ...base, anObject } 
    return merged 
} 
+0

非常感谢,有没有推荐的方式来合并对象在typescript中保留类型信息?我重构了断言的对象,它的工作,只是觉得很hacky。 const merged = {... base,anObject} – laramie

+0

@laramie我不知道如何。相反,我会使用Object.assign作为解决方法。 – weakish

1

传播和休息尚不支持仿制药的时刻。

0

在第一个片段基础是从对象继承的type T。那么你知道在JavaScript中它不是一个强大的关系,因此不是一个is a的关系,所以T不一定是object。 T只是原型继承了对象。打字稿也没有对泛型的理解,所以不支持传播。

在代码段2 base是对象类型,但打字稿支持对象传播和解构。对象类型的值可以传播。此功能主要用于制作对象的副本。所以这就是为什么它没有给出错误。

+0

这只是TypeScript作为#10727的弱点。 – weakish

相关问题