2016-01-04 2 views
3

я следующий код в машинописном:машинопись + ES6 Карта + Index сигнатура типа объекта неявно имеет «любой» тип

export class Config 
{ 
    private options = new Map<string, string>(); 

    constructor() { 
    } 

    public getOption(name: string): string { 
     return this.options[name]; // <-- This line causes the error. 
    } 
} 

И компилятор дает мне эту ошибку:

Error:(10, 16) TS7017: Index signature of object type implicitly has an 'any' type.

Карта «возможна» через es6-shim. Я не совсем уверен, что здесь происходит. На самом деле эта карта меня немного смущает. Предполагается, что карта должна появиться из es6-shim, которая должна реализовать функциональность es6. Но es6 не имеет статических типов, не так ли? Итак, почему Map ожидает, что типы ключей/значений будут использоваться как общие аргументы? Я видел, как некоторые люди добавили флаг «noImplicitAny», но я хочу решить проблему, а не игнорировать ее.

спасибо.

ответ

5

Получение ключей от объекта ES6 карты осуществляется через Map.prototype.get method, не с помощью оператора массива.

Поскольку все объекты в JavaScript являются динамическими и могут иметь добавленные к ним свойства, все же можно использовать оператор доступа к массиву с объектом Map, но это неправильно - вы фактически не используете функциональность Map, просто добавив к экземпляру произвольные свойства. Вы также можете использовать {} вместо new Map() в этот момент. Компилятор TypeScript пытается сказать вам об этом, предупредив вас, что вы пытаетесь использовать подпись индекса, которая не существует.

2

But es6 doesn't have static types, right? So, why the Map expects the key/value types as generic arguments

Это типы времени компиляции. Аналогично, как один может типа массив:

let foo = new Array(); // array of any 
let bar = new Array<string>(); // array of strings 

foo.push(123); // okay 
bar.push(123); // Error : not a string 

Обе линии компилировать new Array() но один обеспечивает проверку на членов

This line causes the error.

Поскольку определение для Map не указывает возврат Тип индексной подписи, тип которой безопасен.

Quick Fix:

public getOption(name: string): string { 
    return this.options[name] as string; 
} 
+1

Этот ответ неправильный. В карте не указывается тип возврата индексной подписи «быть в безопасности», он вообще не указывает на подпись подписи *, потому что объекты Map не работают таким образом (вместо этого они имеют методы get/set). –

-1

Попробуйте создать интерфейс для опций. Что-то вроде,

interface IOptions { 

[propName: string]: string; 

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