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

如何让TypeScript函数根据参数字面量类型确定返回类型?

如何让TypeScript函数返回字面量模板类型而非string类型?

我定义了两种字符串标识符类型:

type OrgId = `org_${string}`;
type TxnId = `txn_${string}`;

我想写一个接收字符串前缀生成ID的函数,目前的实现返回类型是string:

function makeId(args: { prefix: string }): string {
  return args.prefix + "_" + Date.now();
}

但我希望它返回字面量类型,这样就能直接赋值给上面定义的OrgId/TxnId类型:

const orgId: OrgId = makeId({ prefix: "org" });
const txnId: TxnId = makeId({ prefix: "txn" });

我尝试过下面的写法,但因为拼接结果是原始string类型导致报错:

function makeId(args: { prefix: string }): `${typeof args.prefix}_${string}` {
  return args.prefix + "_" + Date.now(); // 类型不匹配
}

请问该如何定义makeId的返回类型,让它返回对应的字面量模板类型?


解决方案

把函数改为泛型函数,让TypeScript捕获prefix的具体字面量类型,再配合类型断言即可实现需求:

function makeId<P extends string>(args: { prefix: P }): `${P}_${string}` {
  return `${args.prefix}_${Date.now()}` as `${P}_${string}`;
}

调用示例:

// 类型完全匹配,无报错
const orgId: OrgId = makeId({ prefix: "org" });
const txnId: TxnId = makeId({ prefix: "txn" });

关键说明

  • 泛型P extends string会保留传入prefix的字面量类型(比如"org"而非宽泛的string),这样返回类型${P}_${string}就能和你定义的OrgId/TxnId模板类型对齐。
  • 由于Date.now()返回数字,拼接后TypeScript默认推断结果为string,因此需要用类型断言告诉编译器返回值符合目标模板类型的结构。

如果追求更严谨的字符串转换,也可以显式把时间戳转为字符串:

function makeId<P extends string>(args: { prefix: P }): `${P}_${string}` {
  return `${args.prefix}_${String(Date.now())}` as `${P}_${string}`;
}

内容的提问来源于stack exchange,提问作者Joey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:40:02