【问题标题】:TypeScript advanced type checksTypeScript 高级类型检查
【发布时间】:2018-07-14 18:26:49
【问题描述】:

请检查代码中的 cmets。能不能得到我想要的东西还是TS没有这个功能?

我需要对 addToRegistry 函数进行类型检查。

TypeScript playground with code

type MessageHandler<T> = ((data: T) => void) | ((data: T) => Promise<void>);

interface AuthPayload {
    id: string;
}

class HandlersRegistry {
    auth?: MessageHandler<AuthPayload>;
    test?: MessageHandler<number>;
}

const registry = new HandlersRegistry();

// handler type should ref on HandlersRegistry[key] by eventType
// function addToRegistry<T>(eventType: keyof HandlersRegistry, handler: ???) {
function addToRegistry<T>(eventType: keyof HandlersRegistry, handler: MessageHandler<T>) {
    registry[eventType] = handler; // should not be an error
}

const authHandler: MessageHandler<AuthPayload> = (data: AuthPayload) => null;

// correct
addToRegistry('auth', authHandler);
// correct, shows error, but I don't want to provide type of payload every time
addToRegistry<number>('test', authHandler);
// should show error, but doesn't
addToRegistry('test', authHandler);

感谢您的回答!

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您可以使用泛型类型来保存键的类型,并使用类型查询来指定参数必须与字段类型相同:

    type MessageHandler<T> = ((data: T) => void) | ((data: T) => Promise<void>);
    
    interface AuthPayload {
        id: string;
    }
    
    class HandlersRegistry {
        auth?: MessageHandler<AuthPayload>;
        test?: MessageHandler<number>;
    }
    
    const registry = new HandlersRegistry();
    
    // handler type should ref on HandlersRegistry[key] by eventType
    // function addToRegistry<T>(eventType: keyof HandlersRegistry, handler: ???) {
    function addToRegistry<K extends keyof HandlersRegistry>(eventType: K, handler: HandlersRegistry[K]) {
        registry[eventType] = handler; // should not be an error
    }
    
    const authHandler: MessageHandler<AuthPayload> = (data: AuthPayload) => null;
    
    // correct
    addToRegistry('auth', authHandler);
    // correct, shows error, but I don't want to provide type of payload every time
    addToRegistry<number>('test', authHandler);
    // show error as expected
    addToRegistry('test', authHandler); 
    

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 2012-09-29
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2018-10-31
    相关资源
    最近更新 更多