类型文字中的计算 属性 名称必须引用类型为文字类型或 'unique symbol' 类型的表达式
A computed property name in a type literal must refer to an expression whose type is a literal type or a 'unique symbol' type
最终我想计算如下
const configOne = {
default: {master: 0},
sg: {master: 1},
}
const configTwo = {
default: {master: 1}
}
基本上object
必须有default
作为必填属性,然后其余属性可以是可选的,但它们必须是国家前缀。下面是我的尝试
enum CID {
'tw',
'sg',
'vn',
}
interface IIndividualConfig {
master: 0 | 1;
}
type IConfig = {
default: IIndividualConfig;
[key in CID]?: IIndividualConfig;
}
const configOne: IConfig = {
default: { master: 0 },
sg: {master: 1}
}
const configTwo: IConfig = {
default: { master: 1 }
}
下面是我在 [key in CID]
遇到的错误
A computed property name in a type literal must refer to an expression whose type is a literal type or a 'unique symbol' type.ts(1170)
A computed property name must be of type 'string', 'number', 'symbol', or 'any'.ts(2464)
出现问题是因为您在定义中定义了 default
而使用 index signature
如下
type IConfig = {
default: IIndividualConfig; // <= Causing error
[key in CID]?: IIndividualConfig;
}
可能的解决方法 1:
type IConfig = {
[key in CID | 'default']?: IIndividualConfig;
}
这不会给您带来错误,但可能不会 100% 适合用例,因为 default
不再是强制性的。因此可能需要查看选项 2
解决方法 2:
type IDefaultConfig = { default: IIndividualConfig; }
type IConfig = IDefaultConfig & {[key in CID]?: IIndividualConfig; };
现在通过使用intersection
,我们将两种类型合并为一个类型,default
将是强制性的,其他键是可选的,如果定义它们必须是CID
类型
最终我想计算如下
const configOne = {
default: {master: 0},
sg: {master: 1},
}
const configTwo = {
default: {master: 1}
}
基本上object
必须有default
作为必填属性,然后其余属性可以是可选的,但它们必须是国家前缀。下面是我的尝试
enum CID {
'tw',
'sg',
'vn',
}
interface IIndividualConfig {
master: 0 | 1;
}
type IConfig = {
default: IIndividualConfig;
[key in CID]?: IIndividualConfig;
}
const configOne: IConfig = {
default: { master: 0 },
sg: {master: 1}
}
const configTwo: IConfig = {
default: { master: 1 }
}
下面是我在 [key in CID]
A computed property name in a type literal must refer to an expression whose type is a literal type or a 'unique symbol' type.ts(1170)
A computed property name must be of type 'string', 'number', 'symbol', or 'any'.ts(2464)
出现问题是因为您在定义中定义了 default
而使用 index signature
如下
type IConfig = {
default: IIndividualConfig; // <= Causing error
[key in CID]?: IIndividualConfig;
}
可能的解决方法 1:
type IConfig = {
[key in CID | 'default']?: IIndividualConfig;
}
这不会给您带来错误,但可能不会 100% 适合用例,因为 default
不再是强制性的。因此可能需要查看选项 2
解决方法 2:
type IDefaultConfig = { default: IIndividualConfig; }
type IConfig = IDefaultConfig & {[key in CID]?: IIndividualConfig; };
现在通过使用intersection
,我们将两种类型合并为一个类型,default
将是强制性的,其他键是可选的,如果定义它们必须是CID
类型