【问题标题】:How to use a generated ambient enum to generate options in angular如何使用生成的环境枚举生成角度选项
【发布时间】:2021-06-30 10:14:46
【问题描述】:

我有一个通过 openapi-generator 生成的打字稿枚举。

看起来像这样:

export declare enum Role {
    SubscriptionOwner = "Subscription Owner",
    Admin = "Admin",
    Developer = "Developer",
    Publisher = "Publisher",
    Editor = "Editor"
}

我想用它来生成选择选项,类似于下面,取自StackBlitz demo

import { Component } from '@angular/core';

export declare enum Symbols {
  equals = '\u003D',
  notEquals = '!='
}

@Component({
  selector: 'my-app',
  template: `
    <p>
      Having the symbol as label and name as value:
      <select>
        <option *ngFor="let symbol of keys(symbols)" [ngValue]="symbol">{{symbols[symbol]}}</option>
      </select>
    </p>
  `
})
export class AppComponent  {
  keys = Object.keys;
  symbols = Symbols;
}

但是,当有“声明”时,它是一个ambient enum,这是行不通的。一旦我删除“声明”它就可以工作,但是由于枚举是一个生成的源,我无法编辑它,它会重新生成。

有什么方法可以将消费者代码中的环境枚举转换为普通枚举,以便生成选项?或者其他从环境枚举生成选项的方法?

更新

好的,我了解了一些关于 .d.ts 文件只是存在于其他地方的代码的标头。我环顾四周,生成的库确实包含以下内容:

var Role;
(function (Role) {
    Role["SubscriptionOwner"] = "Subscription Owner";
    Role["Admin"] = "Admin";
    Role["Developer"] = "Developer";
    Role["Publisher"] = "Publisher";
    Role["Editor"] = "Editor";
})(Role || (Role = {}));
;

所以从reading this 我知道这将私下准备一个带有这些值的角色对象。那为什么我会收到这个错误呢?

error TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'typeof Role'.

使用时

<option *ngFor="let role of keys(roles)" [ngValue]="role">{{roles[role]}}</option>

【问题讨论】:

标签: angular typescript enums ambient


【解决方案1】:

好的,通过阅读here 的更多内容,我发现我可以将索引签名显式声明为字符串,并且返回的值始终为字符串。因为我知道这是真的,因为我正在生成字符串枚举并且声明的 Role.d.ts 也澄清了这一点,所以我将各个角度组件中的角色定义为

roles: {[name: string] : string} = Role;

之后,编译器停止抱怨,选项生成工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多