2015-10-15 5 views
2

Я хотел бы объявить интерфейс Машинопись для такой JSon структуры:Машинопись сильно типизированных ключ значение пары декларации

{ 
 
404: function() { alert("page not found"); }, 
 
400 : function() {...} 
 
}

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

ответ

6

Индексатор

Вы может использовать цифры в качестве ключей в JavaScript, если вы используете [] ключ доступа ...

Давайте начнем с нужным код ...

var x = { 
    404: function() { alert("page not found"); }, 
    400 : function() { alert("...");} 
}; 

x.404(); 

Последнее утверждение выше (вызов функции 404) Будет ошибка с Missing ; before statement, так что вы должны использовать ...

x[404](); 

Хотя это все равно получите вы набираете умозаключение в машинописном (var a = x[404]; - a будет тип () => void) - это не даст вам хорошую авто- завершение.

Интерфейс для этого:

interface HttpCodeAlerts { 
    [index: number]:() => void; 
} 

С автозавершения

нормально в JavaScript и машинопись это рекомендуется использовать более безопасные имена. Упрощенно, вы должны начать их с письмом:

var x = { 
    E_404: function() { alert("page not found"); }, 
    E_400 : function() { alert("...");} 
}; 

x.E_404(); 

интерфейс для этого:

interface HttpCodeAlerts { 
    E_400:() => void; 
    E_404:() => void; 
} 

Framework Style

В большинстве языков, ошибка используется больше как это ...

class HttpCode { 
    static OK = { responseCode: 200, reasonPhrase: 'Okay' }; 
    static NotFound = { responseCode: 404, reasonPhrase: 'Not Found' }; 
}; 

alert(HttpCode.NotFound.reasonPhrase); 
0

Неверная структура JSON, следовательно, не действительна JavaScript (ни TypeScript). Ключи объектов должны быть строками. Согласно this answer номера всегда преобразуются в строки.

Поэтому я предлагаю использовать явные строки в качестве ключей в вашем JSON. Тогда вы можете моделировать ее в машинописном так:

interface ICodes { 
    "404":() => void; 
    [code: string]:() => void; // defines any string key to be function 
} 

var codes: ICodes = { 
    "404": function() { alert("page not found"); }, 
    "400": function() {} 
}; 

// call the function for code 404 
codes["404"](); 
+0

Это недействителен JSON, но он действителен JS. Эти два не соответствуют полностью – JKillian

2

Это, вероятно, может быть один из ответа: -

export interface clientSideFunction{ 
    [code: number]:()=>void; 
} 

использовать этот интерфейс, импортируя его с помощью: -

import {clientSideFunction} from 'filePath'; 
Смежные вопросы