Typescript 在方法中使用KeyTo类型参数

Typescript 在方法中使用KeyTo类型参数,typescript,methods,typescript-typings,typescript-generics,keyof,Typescript,Methods,Typescript Typings,Typescript Generics,Keyof,假设您有以下类: class Foo { protected callbacks: Callbacks = {}; bar(key: string) { const callback = this.callbacks[key]; // do stuff with callback } ... } 回调属性可以(稍后)通过其他方法更改 如何确保作为属性提供的键是回调属性的实际键? 如果将回调实例传递给函数,我将执行以下操作: function bar<

假设您有以下类:

class Foo {
  protected callbacks: Callbacks = {};

  bar(key: string) {
     const callback = this.callbacks[key];
     // do stuff with callback
  }

  ...
}
回调属性可以(稍后)通过其他方法更改

如何确保作为属性提供的键是回调属性的实际键? 如果将回调实例传递给函数,我将执行以下操作:

function bar<T, Key extends keyof T>(callbacks:T, key: Key) { ... }
功能栏(回调:T,key:key){…}
但这不适用于“this”关键字。我知道在泛型中使用原始this.callbacks是不正确的,因为this.callbacks不是一个类型,而是一个实例。但是,使用typeof转换它也不会产生结果

class Foo {
  protected callbacks: Callbacks = {};

  bar<Key extends keyof typeof this.callbacks>(key: Key) { // Cannot find name 'this'
     const callback = this.callbacks[key];
     // do stuff with callback
  }

  ...
}
class-Foo{
受保护的回调:回调={};
bar(key:key){//找不到名称“this”
const callback=this.callbacks[key];
//用回调做一些事情
}
...
}

我错过了什么明显的东西吗?我的整个设计模式都有缺陷吗?

要使这种模式可行,您需要您的类事先知道其
回调
属性的确切键。我不知道回调应该是什么类型,但它显然不够具体,无法满足您的需要?否则,只需将
bar()
方法的
key
参数注释为
key:keyof Callbacks

假设没有特定的
回调
类型适合您,而是希望使用不同的
回调
键创建不同的
Foo
实例,则应将
Foo
设为a,其中包含泛型类型参数(称之为
K
)对应于该实例的
回调
属性的键的并集:

class Foo<K extends PropertyKey> {

  constructor(protected callbacks: { [P in K]: () => void }) { }

  bar(key: K) {
    const callback = this.callbacks[key];
    callback();
  }

}
创建
foo
后,由于传入了回调对象,编译器推断它属于
foo
类型。因此,
foo.bar()
只能以
的“sayHello”
的“saygoody”
作为参数调用

const foo = new Foo({
  sayHello() { console.log("HELLO!") },
  sayGoodbye() { console.log("GOODBYE!") }
})

foo.bar("sayHello"); // HELLO!
foo.bar("sayGoodbye"); // GOODBYE!