【问题标题】:TypeScript: Index signature of object type implicitly has an 'any' typeTypeScript:对象类型的索引签名隐式具有“任何”类型
【发布时间】:2018-12-19 15:15:59
【问题描述】:

我的功能有问题:

    copyObject<T> (object:T):T {
        var objectCopy = <T>{};
        for (var key in object) {
            if (object.hasOwnProperty(key)) {
                objectCopy[key] = object[key];
            }
        }
        return objectCopy;
    }

我有以下错误:

Index signature of object type implicitly has an 'any' type.

我该如何解决?

【问题讨论】:

  • 我认为这是因为var key in object 以及之后key 的使用。可以尝试用noImplicitAny=false 运行编译来确认吗?

标签: typescript


【解决方案1】:
class test<T> {
    copyObject<T> (object:T):T {
        var objectCopy = <T>{};
        for (var key in object) {
            if (object.hasOwnProperty(key)) {
                objectCopy[key] = object[key];
            }
        }
        return objectCopy;
    }
}

如果我按如下方式运行代码

c:\Work\TypeScript>tsc hello.ts

它工作正常。但是,下面的代码:

c:\Work\TypeScript>tsc --noImplicitAny hello.ts

抛出

hello.ts(6,17): error TS7017: Index signature of object type implicitly has an 'any' type.
hello.ts(6,35): error TS7017: Index signature of object type implicitly has an 'any' type.

因此,如果您禁用 noImplicitAny 标志,它将起作用。

似乎还有另一种选择,因为tsc 支持以下标志:

--suppressImplicitAnyIndexErrors   Suppress noImplicitAny errors for indexing objects lacking index signatures.

这也适用于我:

tsc --noImplicitAny --suppressImplicitAnyIndexErrors hello.ts

更新:

class test<T> {
    copyObject<T> (object:T):T {
        let objectCopy:any = <T>{};
        let objectSource:any = object;
        for (var key in objectSource) {
            if (objectSource.hasOwnProperty(key)) {
                objectCopy[key] = objectSource[key];
            }
        }
        return objectCopy;
    }
}

此代码无需更改任何编译器标志即可工作。

【讨论】:

  • 嗨,马丁,这个问题的答案很好,我只是想知道您(或其他任何人)是否知道为什么会这样,或者为什么我们必须定义本地 objectCopy 和 objectSource 变量?
  • 注意:引发错误的原因是您尝试复制的对象上的属性可能比您想要的要多。在 Github 存储库中有很多关于 TypeScript 的信息。我意识到错误并不明显。这可能有帮助吗? github.com/Microsoft/TypeScript/issues/…
【解决方案2】:

我知道我迟到了,但在当前版本的 TypeScript(可能是 2.7 及更高版本)中,你可以像下面这样写。

for (var key in object) {
    if (objectSource.hasOwnProperty(key)) {
        const k = key as keyof typeof object;
        objectCopy[k] = object[k]; // object and objectCopy need to be the same type
    }
}

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 2016-04-07
    • 2017-08-02
    • 2017-05-06
    • 2019-01-06
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多