You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用泛型类型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:01:00