我定义了这三个助手:
export type IdType = PropertyKey;
export type Identifiable<T> = T & {id: IdType};
export type IdGetter<T> = (x: Identifiable<T>) => IdType;
我希望能够使用
IdGetter
泛型来键入泛型方法,例如(这不起作用,但这是我希望能够做的事情):
export const getId<T>: IdGetter<T> = x => x.id
但是我必须写:
export const getId = <T>(x: Identifiable<T>): IdType => x.id;
这没什么大不了的,我仍然可以做这样的事情并且没有类型错误:
const f = <U, F extends IdGetter<U>>(getter: F) => (x: Identifiable<U>): IdType => getter(x);
f(getId);
但是定义这些
getters
的类型是多余的。
有没有一种干净的方法来完成我正在寻找的事情?我正在努力更好地使用泛型。
您可以使用内联类型断言方法直接断言 getId 的类型与 IdGetter 匹配:
export const getId: <T>(x: Identifiable<T>) => IdType = x => x.id;
希望这有帮助!