【问题标题】:Accessing component's variables with type indexing causes TS7053 error in Angular 13使用类型索引访问组件的变量会导致 Angular 13 中出现 TS7053 错误
【发布时间】:2022-01-23 08:40:47
【问题描述】:

我正在尝试使用 Angular 13 中的类型索引访问变量,但遇到 TS7053 错误。 This stackblitz 准确地显示了我正在做的事情,但是它在那里工作得非常好,没有错误。

export class AppComponent  {
  name = 'Angular ' + VERSION.major;

  Prop01 : boolean = false;
  Prop02 : boolean = false;
  Prop03 : boolean = false;

  private setProp(prop: string, value: boolean): void {

    this[prop] = value;   // this works in the Stackblitz but not in my project

  }
}

唯一的区别是我使用的是 V13,而 stackblitz 仍然使用 V12。我查看了我的 VS Code 扩展,发现 Ts LintEs Lint 弃用,所以我禁用它并重新启动 VS Code,但 this[prop] 仍然抛出一个错误,提示

元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“MyComponent”。 在“MyComponent”类型上找不到带有“字符串”类型参数的索引签名。

我在旧版本的 Angular 中做过这个,所以我不明白是什么让它突然不起作用,有人知道这是为什么吗?

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    我建议用这些变量名创建一个enum

    export enum MyEnums {
      Prop01: 'Prop01',
      Prop02: 'Prop02',
      Prop03: 'Prop03'
    }
    

    组件:

    import {myEnum} from './myEnums.ts'
    
    export class AppComponent  {
      name = 'Angular ' + VERSION.major;
      Prop01 : boolean = false;
      Prop02 : boolean = false;
      Prop03 : boolean = false;
    
      private setProp(prop: string, value: boolean): void {
        this[prop as MyEnum] = value;
        console.log(this[prop as myEnum]); // true or false, whatever your send
      }
    }
    

    Angular v12 是第一个默认包含 strict mode 启用(非常好)的版本,因此要求您创建访问该参数的签名非常严格。

    您可以在旧版本中执行此操作,因为除非您手动将其设置为“开启”,否则此处不会启用严格模式

    【讨论】:

    • 这在 Angular 13 中不起作用。枚举通过错误说“没有重复”。我尝试使用 = 而不是 : 来定义它们,错误消失了,但我又回到了和以前一样的 ts 错误。
    【解决方案2】:

    当您使用 3 个单独的变量而不是一个对象时(对于对象,有很多问题和答案,例如:Typescript: No index signature with a parameter of type 'string' was found on type '{ "A": string; }

    对于您的变量,我会使用 type 并声明您的变量名,然后您可以为您的类型调用 as。所以像:

    export type PropType = 'Prop01' | 'Prop02' | 'Prop03'; 
    

    然后是你的函数:

    private setProp(prop: string, value: boolean): void {
      this[prop as PropType] = value;
    }
    

    【讨论】:

    • 好的,我刚试过,不幸的是我仍然遇到同样的错误。
    • 嗯....您的项目设置如何?这是具有严格模式的 Angular13 并适用于上述:stackblitz.com/edit/angular-ktgqmt?file=tsconfig.json您共享的 stackblitz 没有严格模式设置,所以这就是它没有导致错误的原因。如果您可以使用您的配置在我的 stackblitz 中复制它,那就太好了。顺便说一句,需要在 Chrome 中运行我的 stackblitz。
    猜你喜欢
    • 2023-04-09
    • 2021-10-16
    • 1970-01-01
    • 2019-05-14
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2019-12-27
    相关资源
    最近更新 更多