如何在typescript中从泛型调用方法?



我正在尝试创建一个函数,在一些通用对象上调用指定的方法。

这是我想到的:

type MethodName<S extends Object, M extends keyof S> = S[M] extends Function ? M : never 
const callMethod = <S, M extends keyof S>(obj: S, method: MethodName<S, M>) =>
obj[method]()

但是我得到错误这个表达式是不可调用的。即使我将这个函数更改为只返回指定的方法,我也可以稍后调用它:

const getMethod = <S, M extends keyof S>(obj: S, method: MethodName<S, M>) =>
obj[method]
const obj = {
a: 'hi',
call: () => console.log('hi')
}
getMethod(obj, 'call')

如何消除第一种情况下的错误?

type MethodName<S extends Object, M extends keyof S> = S[M] extends Function ? M : never;
const getMethod = <S, M extends keyof S>(obj: S, methodName: MethodName<S, M>) => obj[methodName];
const callMethod = <S, M extends keyof S>(obj: S, methodName: MethodName<S, M>) => {
const method = getMethod(obj, methodName);
// typeof here is not just checking types in runtime but to hints TS within the if clause method must be callable
if (typeof method === 'function') {
method();
} else {
throw new Error('This is not supposed to throw if TS does check things for you');
}
};
const obj = {
a: 'hi',
call: () => console.log('hi')
};
callMethod(obj, 'call');

https://www.typescriptlang.org/play?代码/C4TwDgpgBAshwAsD2ATAcgQwLYQDwGUoIAPYCAOxQGcoB5AIwCsIBjYAGliNIuqgGsIIJADMo + AHxQAvOIDaMALrcylGgDEAruTYBLJOSgB + LgC4o5CADcIAJwDcAWABQLlgarAoAc3hxEqDJQBJwwKrw0gsJikgAUSEzm + Jw4AejYEOb + yOk4IbASAJQyUgmMcqk5mDiKTq7O7uSeUCwYADZt2YGy + WEkqnxRouIS8YniKfBVGVlTqNV4yQXF0lIA3i5QWy0eXpXdPn5zKGOMk2kLhXWb27pisaCQw-soMtKyAOQi2noGH8UbZzbYFQF6xK43LYAXyIbSo0EBIO2iFsSAA7hYIBiAKK2VG2WIfAAqCF0NDJFiQXiomjAYCQ8NewCQUBR6KgdygRMIKCQEBoLAQrH4rNJ5G8NBESFsUGEmn + dWBUJcUOuDV2UDKQUR2ww5g+π+ 7 ehlxabxm4jkoyasdaeaadg0kn5cybciq1a0ol0tmvob8vw0fua

最新更新