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

TypeScript如何限制函数参数为指定interface中类型为number的键名

实现方案

这个需求可以通过TypeScript的条件类型实现,具体方案如下:

核心工具类型

首先构造一个通用工具类型,用于从指定接口中筛选出值为指定类型的键,组成联合类型:

type KeysOfType<T, TargetType> = {
  [K in keyof T]: T[K] extends TargetType ? K : never
}[keyof T]

工具类型逻辑说明:

  • 遍历泛型T的所有键,判断每个键对应的值类型是否匹配目标类型TargetType
  • 匹配则保留键名,不匹配则返回never
  • 最后取所有属性值的联合,never会自动被过滤,最终得到的就是所有符合类型要求的键名联合

完整可运行代码

替换你代码中<SOME MAGIC HERE>的位置即可:

interface dto {
    aaa: string,
    bbb: number,
    ccc: boolean,
    ddd: number,
}

type KeysOfType<T, TargetType> = {
  [K in keyof T]: T[K] extends TargetType ? K : never
}[keyof T]

const variable: dto = {
    aaa: "hello",
    bbb: 42,
    ccc: false,
    ddd: 914    
};

function test(param: KeysOfType<dto, number>): number {
    return variable[param] + 10;
}

console.log(test("aaa")); // 类型报错:dto.aaa类型为string,不符合要求
console.log(test("ccc")); // 类型报错:dto.ccc类型为boolean,不符合要求
console.log(test("eee")); // 类型报错:"eee"不属于dto的合法键
console.log(test("bbb")); // 正常运行,返回52

校验效果

入参只能是"bbb"或"ddd"两种字面量,其他所有值都会触发类型报错,完全符合需求的限制要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:54:02