TypeScript 3.5:如何使用索引器表示法更新对象属性?

TypeScript 3.5:如何使用索引器表示法更新对象属性?,typescript,Typescript,在TS 3.5之前,我能够做到: type Nullable=T |未定义; KeyOf类型=提取; 类型ExcludeKey=T[K]是否可以为null?从不:K; 类型ExtractKey=T[K]可扩展为null?K:从来没有; 类型NonFunctionPropertyNames={[K in KeyOf]:ExcludeKey;}[KeyOf]; 类型TestKey=NonFunctionPropertyNames; 类型TestKeyList=TestKey[]; 课堂测试{ 名称!

在TS 3.5之前,我能够做到:

type Nullable=T |未定义;
KeyOf类型=提取;
类型ExcludeKey=T[K]是否可以为null?从不:K;
类型ExtractKey=T[K]可扩展为null?K:从来没有;
类型NonFunctionPropertyNames={[K in KeyOf]:ExcludeKey;}[KeyOf];
类型TestKey=NonFunctionPropertyNames;
类型TestKeyList=TestKey[];
课堂测试{
名称!:字符串;
年龄:数字;
生日?:日期;
resetSomeField(键:TestKey):无效{
此[键]=未定义;
}
resetAllFields():void{
const keys=Object.keys(this)作为TestKeyList;
keys.forEach(this.resetSomeField);
}
}
但是升级到3.5.3之后就行了

此[键]=未定义;
给我一个错误:

错误TS2322:类型“未定义”不可分配给类型“从不”

我知道这种行为现在是由3.5中引入的一个突破性变化造成的:

但其中提到的解决方法对我来说并不适用——因为我有数百个不同类型属性的对象。我不想像这里建议的那样,为同一类型的每一组属性引入单独的重置函数

我无法找到一个编译器选项来改变这种新的行为

或者,我可以使用以前的TS版本。但显然,这是一个暂时的解决办法


那么,有人能为这个问题提出一个解决办法吗?

问题是你的
名字字段是必需的(由非空断言运算符
)。如果将其更改为
,则Typescript错误消失

之前:

之后:


顺便说一句,如果
key='resetSomeField'
,你希望得到什么结果?我只是不想让代码复杂化,但如果你问-在当前版本中,key只能是
“age”|“name”|“birthDate”
@AntonZhaparov,除非有一些必填字段(你的示例没有),否则我不会得到同样的错误是的,但在较新的TS中,逻辑上,它也包括所有方法。您有意编写不健全的代码,其中不能
未定义的字段被设置为
未定义的
。从TS3.5开始,编译器将为您捕获此信息。如果您确实想忽略它,那么可以使用类型断言,如
(thisaasany)[key]=undefined
this[key]=undefined。如果要修复它,则应将
限制为只能是那些不能
未定义的键
,或者应将所有属性设置为可选。如果您想将其中一个转换为答案(除了最后一个,它已经是答案),请让我知道。由于TS没有空条件运算符(?),此解决方案听起来不可行-使用此方法,我将不得不用
重写所有代码,如果(obj.name!=null){//这里发生了什么事}
请替换(或用代码文本补充)代码图像。图像无法轻松搜索或复制/粘贴。谢谢!但您已经遇到了这个问题,因为当您调用
resetAllFields()
时,设置
object.name=undefined
class Test {
  name?: string;
  age?: number;
  birthDate?: Date;

  resetSomeField(this: Test, key: TestKey): void {
    this[key] = undefined
  }
...