增强接口以删除索引器

时间:2019-03-07 03:14:57

标签: typescript-typings

在@ types / node中,NodeJS.ProcessEnv接口使用索引器声明:

interface ProcessEnv {
    [key: string]: string | undefined;
}

然后用定义的属性对其进行扩充:

declare module NodeJS {
    interface ProcessEnv {
        NODE_ENV: 'development' | 'production';
    }
}

它成功地对process.env.NODE_ENV value 进行类型检查,但仍允许任何属性。如果我使用了错误的属性名称(例如MODE_ENB),则不会由于索引器而产生错误。

有没有一种方法可以将模块扩展应用于有效删除索引器的接口?


尝试失败:

        [key: string]: never;
        NODE_ENV: 'development' | 'production';

错误:类型为“开发”的属性'NODE_ENV'|不能将“ production”'分配给字符串索引类型'never'。ts(2411)

        [key: Exclude<string, 'NODE_ENV'>]: never;
        NODE_ENV: 'development' | 'production';

错误:索引签名参数类型不能为类型别名。考虑改写'[key:string]:从不。ts(1336)

1 个答案:

答案 0 :(得分:0)

部分解决方案是使用:

        [key: string]: unknown;

这将阻止将其他属性分配给已知类型:

const env: string = process.env.NODE_ENVtypo;
// Type 'unknown' is not assignable to type 'string'. ts(2322)

但是仍然会保留您定义的属性的类型:

const env: string = process.env.NODE_ENV;

但在比较值时不会捕获

if (process.env.NODE_ENVZZZ === 'production') { // no error appears