如何创建一个类型来表示TypeScript中的对象?
const definition = {
'with_boolean_prop': {
prop1: true
},
'with_object_prop': {
prop2: {
options: {}
}
}
'with_multiple_props': {
prop3: {
options: {}
}
prop4: true
}
};
键将是{ [key: string]: any }
中的字符串。任何东西都可以用于名称prop1和prop2。但是它们的类型必须是boolean
或只包含options
属性的接口。
这是我到目前为止所做的:
type ItemSchema = { options: string };
type Item = { [key: string]: Boolean | ItemSchema };
type Schema = { [key: string]: Item };
const schema: Schema = {
'item1': {
'prop1': true,
'prop2': {
options: 'some options'
}
}
};
可以工作,但我只能使用字符串作为道具名称,因为TypeScript中的索引器只能是字符串或数字,这是一种限制。
修改 有一些误解,可能是因为我的英语:-)我不反对使用字符串或数字作为索引器。我想要实现的是定义一个类型,其属性只能是一组预定义类型。
像这样:
myObject = {
aProperty: Can be Boolean | Object
bProperty: Can be Boolean | Object
xxxProperty: Can be Boolean | Object
anyProperty: Can be Boolean | Object
}
如果我使用字符串索引器作为属性名称,那么我可以实现我想要的,正如您从上面的示例(ItemSchema和其他类型)中看到的那样,因为它可以在字符串索引器中使用任何值。如果我在没有字符串键的情况下尝试这样做,那么我就不能限制该属性可以接受的类型。
答案 0 :(得分:1)
您当前的解决方案与您想要达到的目标相差无几。如果我理解正确,问题是您还想使用number
作为道具名称,而不仅仅使用string
,对吗?
如果是,则可以使用&
创建交叉点类型。以下是实现此功能的示例:
type ItemSchema = { options: string };
type Item = { [key: string]: Boolean | ItemSchema } & { [key: number]: Boolean | ItemSchema };
type Schema = { [key: string]: Item };
const schema: Schema = {
'item1': {
'prop1': true,
'prop2': {
options: 'some options'
},
4: true,
5: {
options: 'an other option'
},
}
};
以下是代码的TypeScript Playground。