是否有内置的方法可以在打字稿中

时间:2018-07-19 14:58:06

标签: typescript

我想确保我在类型上使用有效的键。我可以为此使用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;
}

但是似乎应该有更多基于语言的方法来执行此操作。

2 个答案:

答案 0 :(得分:0)

如果您可以重写onChanges的方法签名以接受比changes更广泛类型的SimpleChanges,它将为您服务。例如,如下所示:

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

其中Partial<Record<keyof MyComponent, SimpleChange>>表示“一个对象,其键可能与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标记,以便它引起您的注意。祝你好运!

答案 1 :(得分:0)

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

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

我可以摆脱:

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

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

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