【问题标题】:Augment an interface to remove the indexer增加一个接口来移除索引器
【发布时间】:2019-07-28 20:24:28
【问题描述】:

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

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

我正在用我定义的属性来扩充它:

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

它成功地检查了process.env.NODE_ENV,但它仍然允许任何属性。如果我使用了错误的属性名称(例如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]: never' 代替.ts(1336)

【问题讨论】:

    标签: typescript-typings


    【解决方案1】:

    部分解决方案是使用:

            [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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-10
      • 2013-04-21
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多