typescript 如何定义参数类型1为接口的键,参数类型2为接口键对应的值

s2j5cfk0  于 2023-11-20  发布在  TypeScript
关注(0)|答案(1)|浏览(135)

I have this interface接口

export interface TriggerType {
    'sp:assign-topics:success': _CardGroup[],
    'one': string,
    'two': number,
}

字符串
然后是这门课。

export class TriggerHelper {
    public static trigger(type: keyof TriggerType, data?: TriggerType[typeof type]) {
        if (data === undefined) {
            data = null;
        }
        // jQuery(window).trigger(type, data);
        window.dispatchEvent(new CustomEvent(type, {detail: data}));
    }

    public static on(type: keyof TriggerType, callback: (data: TriggerType[typeof type]) => void) {

    }
}


对于trigger方法,我希望typekeyof接口,值是valueof接口的相应key
我也想为trigger函数提供泛型参数,原因有两个

  • 我不想每次调用trigger()时都提供它,因为我希望它是集中的。
  • on()函数中也需要它,用于回调数据类型。这样无论谁调用on(),都会根据他们正在监听的type准确地知道datatype

我现在所拥有的

TriggerHelper.trigger('one', 43);
TriggerHelper.trigger('two', 'hi');


这不是我想要的

2hh7jdfx

2hh7jdfx1#

我想在Typescript中实现这一点的唯一方法是使用泛型,我最初并不想使用泛型来避免多次提供泛型参数。

export class TriggerHelper {
    /**
     *
     * @param type
     * @param data The corresponding value of the key in TriggerType.
     */
    public static trigger<T extends keyof TriggerType>(type: T, data?: TriggerType[T]) {
        if (data === undefined) {
            debugger;
            data = null;
        }
        window.dispatchEvent(new CustomEvent(type, {detail: data}));
    }

    public static on<T extends keyof TriggerType>(type: T, callback: (e: any, data: TriggerType[T]) => void) {
        window.addEventListener(type, (e: any) => {
            callback(e, e.detail);
        });
    }

    public static off<T extends keyof TriggerType>(type: T, callback: (e: any, data: TriggerType[T]) => void) {
        window.removeEventListener(type, (e: any) => {
            callback(e, e.detail);
        });
    }
}

字符串
然而,事实证明,当Typescript可以重写时,泛型也会被推断出来,这在这里很有帮助。所以我不需要一直提供泛型参数,即使它们在方法中定义。@jonrsharpe在评论中也正确地指出了这一点。

相关问题