2015-12-29 44 views
10

我有我的函数问题的“任意”类型:打字稿:对象类型的指数签名暗中有

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. 

如何解决它?

+0

我认为这是因为对象中的var关键字和之后的'key'的用法。你可以尝试用'noImplicitAny = false'来运行编译来确认吗? – FlorianTopf

回答

12
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; 
    } 
} 

此代码在不更改任何编译的情况下工作呃旗帜。

+1

这很好用!谢谢! – uksz

+4

嗨,马丁,这个问题很好的答案,我只是想知道你(或其他人)是否知道为什么会这样,或者为什么我们必须定义本地objectCopy和objectSource变量? –