如何确保TypeScript函数参数为接口的字符串类型字段键?
限定函数参数为接口中特定类型字段的键
你当前的问题是prop_rich_text函数允许传入HouseDetails的任意键,但部分键对应的值是数字类型,导致类型不匹配。要解决这个问题,可以通过自定义工具类型过滤出接口中值为字符串类型的键,同时优化空值判断逻辑。
步骤1:定义工具类型提取目标键
首先创建一个工具类型,用来从接口中筛选出值类型为指定类型的键:
// 工具类型:提取T中值类型兼容U的键 type KeysOfType<T, U> = { [K in keyof T]: T[K] extends U ? K : never }[keyof T];
这个类型会遍历T的所有键,仅保留那些值类型匹配U的键,最终得到一个联合类型。
步骤2:修改函数参数类型与逻辑
将prop_rich_text的参数类型从keyof HouseDetails替换为上面定义的工具类型,同时优化空值判断(避免误判空字符串等合法值):
type Property = { type: "rich_text", rich_text: string, } | { type: "number", value: number, } function get_house_properties(dbm: DatabaseMapping, hd: HouseDetails): Record<string, Property> { // 仅允许传入HouseDetails中值为string | undefined的键 function prop_rich_text(key: KeysOfType<HouseDetails, string | undefined>): Record<string, Property> { // 判断值是否为undefined,而非直接判断真值(避免空字符串被过滤) if (hd[key] !== undefined) { return { [dbm[key]]: { type: "rich_text", // 非空断言:已通过判断确认值不为undefined rich_text: hd[key]!, } } } return {} } return { ...prop_rich_text('address'), // 正常运行 ...prop_rich_text('comments'), // 正常运行 ...prop_rich_text('price'), // 触发编译错误:类型不匹配 } }
效果说明
- 当传入
address、comments这类字符串类型的键时,TypeScript能正确推断hd[key]的类型为string | undefined,配合非空断言和判断逻辑,完美匹配rich_text的类型要求。 - 当传入
price、sq_meters这类数字类型的键时,TypeScript会直接抛出编译错误,符合你预期的校验效果。 - 空值判断改为
hd[key] !== undefined后,空字符串这类合法的字符串值也会被正确处理,不会被误过滤。
内容的提问来源于stack exchange,提问作者David Davó
相关产品推荐
相关产品推荐

