布设
我有以下Typescript 类型:
type Item = { id: string };
type Config = { enabled: boolean };
type API = {
getItems(): Promise<Item[]> | undefined,
getItem(id: Item['id']): Promise<Item> | undefined,
getConfig(): Promise<Config>,
getConfigKey(key: keyof Config): Promise<Config[keyof Config]>,
};
并希望将其转换为以下内容(是的,也是大写的变化):
handle('GetItems', (event) => {
return [{} as Item]; // needs to follow the type above (Item[])
});
handle('GetItem', (event, id) => { // the parameter comes from the type above (has the type of Item['id'])
return { id } as Item;
});
handle('GetConfig', (event, item) => ({}) as Config); // this should error as no parameter is specified for the getConfig type above
我的解决方案及其问题
function handle<T extends keyof API>(
name: Capitalize<T>,
handler: API[T] extends (...args: infer Args) => infer R
? (event: Event, ...args: Args) => R
: never
): void {}
无论出于何种原因,它都会设法正确地获取返回类型,但不能正确获取参数.如果API键没有参数,try 使用任何参数只会导致错误,如果API键有任何参数,处理程序上的第一个参数将是Event
,下面的参数将是never
.所以就像这样:
handle('GetConfig', async (event) => {
// ^
// Argument of type '(event: Event) => Promise<{ enabled: false; }>' is not assignable to parameter of type '(event: Event, ...args: never) => Promise<Item[]> | Promise<Item> | Promise<Config> | Promise<boolean> | undefined'.
// Types of parameters 'event' and 'event' are incompatible.
// Type '[event: Event, ...args: any[]]' is not assignable to type '[event: Event]'.
// Target allows only 1 element(s) but source may have more.ts(2345)
return { enabled: true };
});
handle('GetItem', async (event, id) => { // id has the type of never
return { id };
});
更奇怪的是,如果我try 使用原始的API密钥名称,我会得到正确的参数,例如:
handle('getItem', async (event, id) => { // event and id have the correct type but I get an error due to using 'getItem' instead of 'GetItem'
return { id };
});
奇怪的是,如果我不大写name
变量,一切似乎都按预期工作.
做这件事最简单的方法是什么?这是一种极端的极端情况,还是我错过了什么?