2016-05-06 2 views
0

Я хочу создать интерфейс объекта, который заставляет использовать строку в качестве ключей, но коды компилятора TypeScript, даже если у него был тип номера в качестве ключа. Зачем?Как заставить типы ключей в интерфейсе TypeScript?

Например,

interface PriceI { 
    [key:string]:number; 
} 

var coursePrice: PriceI = {}; 
coursePrice["Orange"] = 100; 
coursePrice["Apple"] = 200; 
coursePrice[3]=200; // It should be compile error, but it pass 
coursePrice[true]=300; // It's compile error 
+1

Статическая типизация в машинописном тексте является компромиссом между высокодинамичным характером javascript и жестким типом принудительного применения на большинстве строго типизированных языков. Я сам предпочел бы более строгий TS, но дизайнеры боятся отпугивать людей из JS. – Alex

ответ

2

См the handbook:

Есть два типа поддерживаемых подписей индекса: строка и число. Можно поддерживать оба типа индексаторов, но тип, возвращаемый из числового индексатора, должен быть подтипом типа, возвращаемого из индексатора строк. Это связано с тем, что при индексировании с number JavaScript фактически преобразует это значение в string перед индексированием в объект. Это означает, что индексирование с 100 (a number) - это то же самое, что индексирование с "100" (a string), поэтому эти два должны быть согласованными.

В вашем примере TypeScript считает, что coursePrice[3] = 200; эквивалентен coursePrice["3"] = 200;.

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