Можна позначити obj
як any
, але це перемагає цілі використання машинопису. obj = {}
означає obj
, що це Object
. Позначати це як any
немає сенсу. Для досягнення потрібної консистенції інтерфейс можна визначити наступним чином.
interface LooseObject {
[key: string]: any
}
var obj: LooseObject = {};
АБО зробити компактним:
var obj: {[k: string]: any} = {};
LooseObject
може приймати поля з будь-яким рядком як ключ та any
тип як значення.
obj.prop = "value";
obj.prop2 = 88;
Справжня елегантність цього рішення полягає в тому, що ви можете включити в інтерфейс поля typesafe.
interface MyType {
typesafeProp1?: number,
requiredProp1: string,
[key: string]: any
}
var obj: MyType ;
obj = { requiredProp1: "foo"}; // valid
obj = {} // error. 'requiredProp1' is missing
obj.typesafeProp1 = "bar" // error. typesafeProp1 should be a number
obj.prop = "value";
obj.prop2 = 88;
Хоча це відповідає на оригінальне запитання, відповідь тут від @GreeneCreations може дати іншу точку зору, як підійти до проблеми.