Typescript keyof - 如何在声明中使用该值?

时间:2017-04-14 20:37:25

标签: typescript typescript2.0

我正在尝试使用keyof在现有JS库中强制执行类型安全(因此我无法重新定义任何函数调用)。该类使用getset函数包装数据结构,如下所示:

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) => {})

看起来很奇怪。

1 个答案:

答案 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) => { });
    }
}