关于索引类型和映射类型的打字稿说明

时间:2018-03-23 17:38:31

标签: typescript

我有一个接口,它定义了一个可用于将命令行参数传递给应用程序的对象:

type argumentPrimitive = string | number | Date | boolean;

export type IApplicationArguments = {
    [key: string]: argumentPrimitive | argumentPrimitive[];
}

我还有一个接口,可以选择用包含该参数的配置信息的对象替换值:

export type IApplicationArgumentsConfiguration<T extends IApplicationArguments> = {
    readonly [P in keyof T]?: T[P] | CommandOption<T[P]>;
}

在我的函数中处理这个我想迭代值:

function parseCommands<T extends IApplicationArguments>(optionDefinition: IApplicationArgumentsConfiguration<T>): T {

    for (let propertyName in optionDefinition) {
        const propertyValue: argumentPrimitive | CommandOption<argumentPrimitive> =  optionDefinition[propertyName];
    }
}

这不编译:

  

类型'IApplicationArgumentsConfiguration [keyof T]'不能赋值为'string |号码|布尔值|日期| CommandOption”。

Playground链接有完整错误:

Typescript Playground

有没有办法将映射类型传递给迭代代码?

1 个答案:

答案 0 :(得分:0)

问题在于我忘记了阵列的可能性。

将代码更正为:

export interface CommandOption<T> {
    sampleValue: T;
}

type argumentPrimitive = string | number | Date | boolean;

type argumentTypes = argumentPrimitive | argumentPrimitive[];

export type IApplicationArguments = {
    [key: string]: argumentTypes;
}

export type IApplicationArgumentsConfiguration<T extends IApplicationArguments> = {
    readonly [P in keyof T]: T[P] | CommandOption<T[P]>;
}

function parseCommands<T extends IApplicationArguments>(optionDefinition: IApplicationArgumentsConfiguration<T>) {

    for (let propertyName in optionDefinition) {
        const propertyValue: argumentTypes | CommandOption<argumentTypes> =  optionDefinition[propertyName];
    }
}

使其正确编译。