在typescript中有任何方法可以为变量分配通用对象类型。 这就是我所说的'通用对象类型'
let myVariable: GenericObject = 1 // Should throw an error
= 'abc' // Should throw an error
= {} // OK
= {name: 'qwerty'} //OK
即。它应该只允许将javascript对象分配给变量,而不允许其他类型的数据(数字,字符串,布尔值)
答案 0 :(得分:26)
当然可以:
type GenericObject = { [key: string]: any };
let myVariable1: GenericObject = 1; // Type 'number' is not assignable to type '{ [key: string]: any; }'
let myVariable2: GenericObject = 'abc'; // Type 'string' is not assignable to type '{ [key: string]: any; }'
let myVariable3: GenericObject = {} // OK
let myVariable4: GenericObject = {name: 'qwerty'} //OK
答案 1 :(得分:2)
从TypeScript 2.2开始,您可以使用
let myVariable: object;
编辑:这是一个例子:
let myVariable: object = { fun: 1 };
答案 2 :(得分:2)
Typescript 2.1+还具有一个utility type,Record<K, T>
,您可以使用它来代替自己的定义
const myObj: Record<string, any>;
当我可以给key
赋予一个有意义的名称时,我喜欢使用顶部答案中描述的样式,但是如果它不是很明显或没有必要,Record
是一个不错的选择。
答案 3 :(得分:0)
有些切线,因为我在这里的@JaredMcAteer处没有找到类似的答案,使用record
帮助我混合了枚举和对象。
enum FOO_ENUM {
BAR = 'BAZ';
}
type FOO_OBJECT_TYPE = { ... };
const BIZ_OBJECT: Record<FOO_ENUM, FOO_OBJECT_TYPE> = {
[FOO_ENUM.BAR]: { ... }
}
在我将BIZ_OBJECT
键入为
之前
BIZ_OBJECT: {[type: string]: FOO_OBJECT}
允许使用类似BIZ_OBJECT.asd
之类的内容,现在只能使用FOO_ENUM
中的密钥,例如
BIZ_OBJECT.BAZ // { ... }
BIZ_OBJECT.asd // Property 'asd' does not exist on type ...
BIZ_OBJECT[FOO_ENUM.BAR] // { ... }
BIZ_OBJECT[FOO_ENUM.asd] // Property 'asd' does not ...
BIZ_OBJECT[FOO_ENUM['asd']] // ! not caught !