在@ 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)
答案 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