如何在TypeScript动态属性中建模?

如何在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 } 我仍然有打字错误。如何正确处理此问题?如果您的示例代码是真实的,显示了准确的错误,并且没有其他打字错误或问题,那就太好了,但我想

当我在TypeScript中使用作为字符串引用的对象属性时,我不想以某种方式忽略ts。也就是说,我有这样一个定义:

const myList = ['aaa','bbb','ccc'];
const appContext = {};
for (let i=0;i<3,i++) {
  appContext[myList[i]] = 'newval' + i
}

我仍然有打字错误。如何正确处理此问题?

如果您的示例代码是真实的,显示了准确的错误,并且没有其他打字错误或问题,那就太好了,但我想我知道发生了什么

您可能面临的主要问题是
myList
被编译器推断为type
string[]
。对于编译器来说,这是一个合理的猜测,因为人们通常编写
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
}