打字稿中的通用对象类型

时间:2016-11-16 20:08:51

标签: typescript types

在typescript中有任何方法可以为变量分配通用对象类型。 这就是我所说的'通用对象类型'

let myVariable: GenericObject = 1 // Should throw an error
                              = 'abc' // Should throw an error
                              = {} // OK
                              = {name: 'qwerty'} //OK

即。它应该只允许将javascript对象分配给变量,而不允许其他类型的数据(数字,字符串,布尔值)

4 个答案:

答案 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

code in playground

答案 1 :(得分:2)

从TypeScript 2.2开始,您可以使用

let myVariable: object;

编辑:这是一个例子:

let myVariable: object = { fun: 1 };

答案 2 :(得分:2)

Typescript 2.1+还具有一个utility typeRecord<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 !