在TypeScript中创建一个奇怪的类型

时间:2017-11-18 06:36:56

标签: typescript

如何创建一个类型来表示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和其他类型)中看到的那样,因为它可以在字符串索引器中使用任何值。如果我在没有字符串键的情况下尝试这样做,那么我就不能限制该属性可以接受的类型。

1 个答案:

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