如何用泛型类型IdGetter定义函数的类型签名?
TypeScript泛型类型简化问题
我定义了以下三个辅助类型:
export type IdType = PropertyKey; export type Identifiable<T> = T & {id: IdType}; export type IdGetter<T> = (x: Identifiable<T>) => IdType;
我希望直接用泛型类型IdGetter<T>来定义泛型方法,比如下面这种(虽然无法运行,但这是我想要的效果):
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的类型太冗余了。我正在学习更高效地使用泛型,有没有更简洁的方式实现我想要的效果?
简洁实现方案
你可以通过在类型标注位置声明泛型的方式,直接复用IdGetter类型来定义getId:
export const getId: <T>IdGetter<T> = x => x.id;
这种写法完全符合你最初的期望,TypeScript能够正确推断泛型参数,同时复用了已定义的IdGetter类型。
另外,针对你后续的f函数,也可以简化类型声明,不需要额外的泛型约束,直接使用IdGetter<U>作为参数类型:
const f = <U>(getter: IdGetter<U>) => (x: Identifiable<U>): IdType => getter(x); f(getId);
这样代码更简洁,类型检查和推断依然能正常工作。
内容的提问来源于stack exchange,提问作者djfm
相关产品推荐
相关产品推荐

