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

TypeScript如何将函数string参数作为字面量字符串传入类型工具

让vars函数动态使用传入的字符串字面量作为类型前缀

当前问题是vars函数里硬编码了固定前缀'--XXX-',导致传入自定义前缀(比如'--YYY-')时,类型推导不符合预期。需要修改函数,让传入的scope参数作为UnprefixKeys的前缀,同时不新增额外泛型参数。

修改方案

我们可以通过类型工具从目标类型T中自动提取键的公共前缀,再将这个前缀关联到scope参数和UnprefixKeys工具上:

// 保留原有的类型工具
type UnprefixKey<K extends PropertyKey, Prefix extends string>
  = K extends `${Prefix}${infer P}` ? P : K

type UnprefixKeys<T, Prefix extends string> = {
  [K in keyof T as UnprefixKey<K, Prefix>]: T[K]
}

// 新增:从T的键中提取公共前缀的类型工具
type ExtractPrefix<T> = 
  T extends Record<`${infer P}${string}`, unknown> 
    ? P 
    : never;

// 修改后的vars函数
function vars<T extends Record<`${ExtractPrefix<T>}${string}`, unknown>>(
  scope: ExtractPrefix<T>,
  vars: UnprefixKeys<T, ExtractPrefix<T>>
): T {
  // 原函数逻辑保持不变
  return {} as T;
}

使用示例

type SomeType = {
  '--YYY-a': number
  '--YYY-b': number
}

// 此时类型检查完全正确:
// scope必须传入'--YYY-',vars的输入类型为{a: number, b: number}
vars<SomeType>('--YYY-', {
  a: 1,
  b: 2,
})

原理说明

  1. ExtractPrefix<T>:通过模板字符串类型的infer特性,从T的所有键中提取公共的前缀部分。比如SomeType的键都是--YYY-开头,所以ExtractPrefix<SomeType>会被推导为字面量类型'--YYY-'。
  2. 函数参数关联:将scope的类型绑定为ExtractPrefix<T>,确保传入的前缀必须和T的键前缀完全匹配;同时UnprefixKeys<T, ExtractPrefix<T>>会动态使用这个前缀,把T的键转换为无前缀的输入结构。
  3. 无额外泛型:整个函数只保留T作为唯一泛型参数,完全符合需求。

现在调用vars<SomeType>时,类型系统会自动关联scope的字面量类型和UnprefixKeys的前缀,返回类型正确为SomeType,解决了之前硬编码前缀导致的类型不匹配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:33:15