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!