Это можно обозначить 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;
Настоящая элегантность этого решения заключается в том, что вы можете включить в интерфейс типобезопасные поля.
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 может дать другую точку зрения на то, как подойти к проблеме.