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

TypeScript模板字符串类型如何定义排除'on'开头的字段约束

TypeScript 对象方法字段类型约束实现方案

TypeScript 暂不支持直接在索引签名的模板字面量中编写“不以指定字符串开头”的匹配规则,你需要结合映射类型的as重映射语法+条件类型来实现需求,完整实现代码如下:

type Event = {
  // 匹配所有以 on 开头的键
  [K in string as K extends `on${infer _}` ? K : never]: (e: string) => void
} & {
  // 匹配所有不以 on 开头的键,对应方法参数为number
  [K in string as K extends `on${infer _}` ? never : K]: (e: number) => void
}

验证示例

你可以用以下代码验证类型是否符合预期:

const demo: Event = {
  onSubmit: (val) => {
    // val 会被自动推断为 string 类型
    console.log(val.toUpperCase())
  },
  calc: (val) => {
    // val 会被自动推断为 number 类型
    console.log(val * 100)
  }
}

如果你的对象键是可枚举的,还可以用泛型版本获得更严格的类型校验:

type Event<T extends string> = {
  [K in T as K extends `on${infer _}` ? K : never]: (e: string) => void
} & {
  [K in T as K extends `on${infer _}` ? never : K]: (e: number) => void
}

// 传入所有可能的键的联合类型
type MyEvent = Event<'onClick' | 'onFocus' | 'getTotal' | 'clear'>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:54:00