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

如何确保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ó

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:00:12