Typescript 类型脚本高级类型检查

Typescript 类型脚本高级类型检查,typescript,Typescript,请检查代码中的注释。有可能得到我想要的还是TS没有这样的功能 我需要对我的addToRegistry函数进行类型检查 type MessageHandler=((数据:T)=>void)|((数据:T)=>Promise); 接口验证有效负载{ id:字符串; } 类句柄注册表{ auth?:MessageHandler; 测试?:MessageHandler; } const registry=new HandlersRegistry(); //处理程序类型应按事件类型引用HandlersR

请检查代码中的注释。有可能得到我想要的还是TS没有这样的功能

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

type MessageHandler=((数据:T)=>void)|((数据:T)=>Promise);
接口验证有效负载{
id:字符串;
}
类句柄注册表{
auth?:MessageHandler;
测试?:MessageHandler;
}
const registry=new HandlersRegistry();
//处理程序类型应按事件类型引用HandlersRegistry[key]
//函数addToRegistry(事件类型:keyof HandlersRegistry,handler:??){
函数addToRegistry(事件类型:keyof HandlersRegistry,处理程序:MessageHandler){
注册表[eventType]=handler;//不应为错误
}
const authHandler:MessageHandler=(数据:AuthPayload)=>null;
//正确的
addToRegistry('auth',authHandler);
//正确,显示错误,但我不想每次都提供有效负载的类型
addToRegistry('test',authHandler);
//应该显示错误,但不显示
addToRegistry('test',authHandler);

感谢您的回答!

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

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); 
type MessageHandler=((数据:T)=>void)|((数据:T)=>Promise);
接口验证有效负载{
id:字符串;
}
类句柄注册表{
auth?:MessageHandler;
测试?:MessageHandler;
}
const registry=new HandlersRegistry();
//处理程序类型应按事件类型引用HandlersRegistry[key]
//函数addToRegistry(事件类型:keyof HandlersRegistry,handler:??){
函数addToRegistry(事件类型:K,处理程序:HandlersRegistry[K]){
注册表[eventType]=handler;//不应为错误
}
const authHandler:MessageHandler=(数据:AuthPayload)=>null;
//正确的
addToRegistry('auth',authHandler);
//正确,显示错误,但我不想每次都提供有效负载的类型
addToRegistry('test',authHandler);
//按预期显示错误
addToRegistry('test',authHandler);

非常感谢您!
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);