我想确保我在类型上使用有效的键。我可以为此使用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;
}
但是似乎应该有更多基于语言的方法来执行此操作。
答案 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; }