gpt4 book ai didi

TypeScript 高级类型检查

转载 作者:搜寻专家 更新时间:2023-10-30 21:57:54 25 4
gpt4 key购买 nike

请检查代码中的注释。是否可以得到我想要的或者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);

感谢您的回答!

最佳答案

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

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);

关于TypeScript 高级类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51337212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com