2015-12-29 2 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 

Update:

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

Этот код работает без изменения компиляции er флаги.

+1

Это отлично работает! Благодаря! – uksz

+4

Привет, Мартин, отличный ответ на вопрос, мне просто интересно, знаете ли вы (или кто-либо еще), почему это работает, или почему мы должны определять локальные переменные objectCopy и objectSource? –

Смежные вопросы