如何在TypeScript动态属性中建模?
当我在TypeScript中使用作为字符串引用的对象属性时,我不想以某种方式忽略ts。也就是说,我有这样一个定义:如何在TypeScript动态属性中建模?,typescript,typescript-typings,Typescript,Typescript Typings,当我在TypeScript中使用作为字符串引用的对象属性时,我不想以某种方式忽略ts。也就是说,我有这样一个定义: const myList = ['aaa','bbb','ccc']; const appContext = {}; for (let i=0;i<3,i++) { appContext[myList[i]] = 'newval' + i } 我仍然有打字错误。如何正确处理此问题?如果您的示例代码是真实的,显示了准确的错误,并且没有其他打字错误或问题,那就太好了,但我想
const myList = ['aaa','bbb','ccc'];
const appContext = {};
for (let i=0;i<3,i++) {
appContext[myList[i]] = 'newval' + i
}
我仍然有打字错误。如何正确处理此问题?如果您的示例代码是真实的,显示了准确的错误,并且没有其他打字错误或问题,那就太好了,但我想我知道发生了什么 您可能面临的主要问题是
myList
被编译器推断为typestring[]
。对于编译器来说,这是一个合理的猜测,因为人们通常编写constfoo=[“a”,“b”]
之类的东西,希望以后修改数组中的值,比如foo.push(“c”)
(一个const
声明只意味着你不能再写foo=…
,而不是你不能在它上面设置属性或者调用状态变异方法)
为了帮助编译器在对像[“aaa”、“bbb”、“ccc”]
这样的文本值进行错误推断,您可以使用a来要求编译器假设该值将保持原样而不更改。如果您编写const myList=['aaa'、'bbb'、'ccc']作为常量
,编译器将给myList
类型只读[“aaa”、“bbb”、“ccc”],一个长度为3的类型,其值不能被重写,其类型是准确的“aaa”
,“bbb”
,以及“ccc”
在此之后,只要您知道appContext
是一个IAppContext
,就像const-appContext={}和IAppContext
一样,您的代码应该在没有任何警告的情况下编译。您不能仅仅像const-appContext:IAppContext={}/code>那样对它进行注释,因为这不是真的(现在)。它以空开头,这不是一个有效的IAppContext
。类型断言是告诉编译器不要担心它,因为即使appContext
一开始不是有效的IAppContext
,但在循环运行后它最终将是一个。但请记住,您有责任确保如果您的myList
只是['aaa','bbb']
,代码编译时仍然没有警告,并且当您稍后调用appContext.ccc.toUpperCase()时,您在运行时会感到悲伤
。类型断言是指当编译器无法验证正确的类型时,您负责正确的类型。因此,请认真对待这一责任
无论如何,这里是没有编译器错误的结果代码:
interface IAppContext {
aaa: string;
bbb: string
ccc: string
}
const myList = ['aaa', 'bbb', 'ccc'] as const; // const context to remember literals
const appContext = {} as IAppContext; // assert because it starts off empty
for (let i = 0; i < 3; i++) {
appContext[myList[i]] = 'newval' + i
}
接口IAppContext{
aaa:字符串;
bbb:字符串
字符串
}
const myList=['aaa','bbb','ccc']作为const;//用于记忆文本的const上下文
const appContext={}作为IAppContext;//断言,因为它以空开头
for(设i=0;i<3;i++){
appContext[myList[i]='newval'+i
}
希望有帮助,祝你好运
interface IAppContext {
aaa: string;
bbb: string
ccc: string
}
const myList = ['aaa', 'bbb', 'ccc'] as const; // const context to remember literals
const appContext = {} as IAppContext; // assert because it starts off empty
for (let i = 0; i < 3; i++) {
appContext[myList[i]] = 'newval' + i
}