declare interface timezoneSyntax {
region: string;
en: {
x: string;
offset: {
EST?: number;
EDT?: number;
[key: string]: number;
};
};
it: {
x: string;
}
}
如何使以下对象成为可选的并且 en
通用?
en: {
x: string;
offset: {
EST?: number;
EDT?: number;
[key: string]: number;
};
};
我试图将 en
转换为 [key: string]?
但它显示错误。请指教。
最佳答案
[key: string]: T
形式的索引可以被认为是总是可选的,所以不需要用 ?
符号来指定它。
但是,指定这样的索引签名会强制所有 接口(interface)属性具有与键相同的T
类型。例如,region
会导致
Property 'region' of type 'string' is not assignable to string index type '{ x: string; offset: { ... }; }'
这是因为索引签名 [key: string]: T
简单地规定了所有 接口(interface)属性应该是什么样子。另一种方法是使用 [key: string]: any
但你会放松你的类型安全。
据我了解,这不是您想要的副作用,因此您应该重新考虑在此界面中使用索引键并找到不同的方法。
提案
不要使用特定于语言的属性名称(en
、it
、es
等),而是使用通用的语言
作为名称。如果您还需要知道您正在处理的是哪种语言,那么应该将其作为 name
添加到 language
模型中。
你最终会得到这样的结果:
declare interface timezoneSyntax {
region: string;
language: {
name: string; // `en`, `it`, `es`, etc
x: string;
offset: {
EST?: number;
EDT?: number;
[key: string]: number;
};
};
}
延伸阅读
关于javascript - 如何在 typescript 中创建一个可选的对象键字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57145172/