如何让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
相关产品推荐
相关产品推荐

