【问题标题】:Is there a builtin way to create a keyof literal in typescript是否有一种内置方法可以在打字稿中创建 keyof 文字
【发布时间】:2018-08-14 00:05:45
【问题描述】:

我想确保我在一个类型上使用了有效的键。我可以为此使用 keyof,但似乎我需要先创建一个 const:

ngOnChanges(changes: SimpleChanges) {
  let open: keyof MyComponent = "open";
  if (changes[open]) {
    // ... do something
  }
}

我可以创建一个函数来强制执行此操作:

ngOnChanges(changes: SimpleChanges) {
  if (changes[this.keyOf<MyComponent>("open")]) {
    // ... do something
  }
}

keyOf<T>(key: keyof T) {
  return key;
}

但似乎应该有更多基于语言的方式来做到这一点。

【问题讨论】:

  • SimpleChanges 类型是如何定义的? SimpleChanges 的每个键都必须是MyComponent 的键,这是真的吗?还是有其他限制?
  • SimpleChanges 是 Angular 6 的一部分:接口:SimpleChanges { [propName: string]: SimpleChange; }。并且是这个出现的一个地方,但是。大多数情况下,我试图确保这种事情是可重构的。

标签: typescript


【解决方案1】:

如果您可以重写onChanges 的方法签名以接受比SimpleChanges 更广泛类型的changes,它将为您工作。例如,像这样:

ngOnChanges(changes: Partial<Record<keyof MyComponent, SimpleChange>>) {
  if (changes.open) {
    // ... do something
  }
}

其中Partial&lt;Record&lt;keyof MyComponent, SimpleChange&gt;&gt; 表示“一个对象,其键可能与MyComponent 的键匹配,并且其属性(如果存在)为SimpleChange”。这是SimpleChanges = { [propName: string]: SimpleChange; } 的超类型,这意味着“一个对象,其中每个string 值的键都具有与之关联的SimpleChange 类型的属性”。

如果您无法重写方法签名,那么您可以在方法内部进行加宽,但这与您之前的解决方法类似,因为您需要定义一个新常量:

ngOnChanges(changes: SimpleChanges) {
  const widerChanges: Partial<Record<keyof MyComponent, SimpleChange>> = changes;      
  if (widerChanges.open) {
    // ... do something
  }
}

无论如何,希望这有意义并有所帮助。如果这不能满足您的需求并且您需要一些特定于角度的帮助,您可能需要在这个问题中添加一个angular 标签,以便它达到不同的眼光。祝你好运!

【讨论】:

    【解决方案2】:

    jcalz 答案提供了关键(所以我标记为正确,谢谢!),但是,我添加了一些改进: 如果我创建一个别名类型:

    type SimplerChanges<T> =  Partial<Record<keyof T, SimpleChange>>;
    

    我可以逃脱:

      ngOnChanges(changes: SimplerChanges<MyComponent>) {
        if (changes.open) {
          // do something 
        }
      }
    

    不完全确定原因,因为我正在缩小该方法中可接受的范围:

    export interface SimpleChanges { [propName: string]: SimpleChange;  }
    

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 2021-09-22
      • 1970-01-01
      • 2017-12-27
      • 2023-02-16
      • 2019-07-27
      • 2017-02-25
      • 1970-01-01
      • 2020-02-10
      相关资源
      最近更新 更多