我正在尝试使用keyof
在现有JS库中强制执行类型安全(因此我无法重新定义任何函数调用)。该类使用get
和set
函数包装数据结构,如下所示:
declare class Component<T> {
set(data: T);
get(key: keyof T);
}
到目前为止一切顺利!但现在我想添加一个观察者,使用我在keyof
中使用的相同get
功能。它的第二个参数是一个回调函数,它给出了所提供密钥的新旧值。我试过像这样创建它:
type Callback<T, K extends keyof T> = (newValue: T[K], oldValue: T[K]) => void;
declare class Component<T> {
observe(key: keyof T, cb: Callback<T, key>)
}
但TypeScript拒绝在key
函数中使用observe
,说
无法找到名称'key'
我现在有什么办法解决这个限制吗?我可以这样做:
observe<K extends keyof T>(key: keyof T, cb: Callback<T,K>)
它工作正常,但这意味着我的实际代码是:
thing.observe<"key">("key", (newValue, oldValue) => {})
看起来很奇怪。
答案 0 :(得分:1)
尝试使用它:
type Callback<T, K extends keyof T> = (newValue: T[K], oldValue: T[K]) => void;
declare class Component<T> {
observe<K extends keyof T>(key: K, cb: Callback<T, K>);
}
// example class
class XClass extends Component<{ name: string; value: number; }> {
testFn(): void {
// here the first argument needs to be a name of a T property
// newValue and oldValue will be the same type of this property
this.observe("name", (newValue, oldValue) => { });
}
}