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

如何定义泛型函数,限制指定键的取值类型为字符串?

问题描述

需要定义一个泛型函数,接收对象数组和该对象的3个列名。原函数定义如下:

function myFunction<T, K extends keyof T>(dataset: T[], propertyOne: K, propertyTwo: K, propertyThird: K): {...}

该定义可正常工作,但现在要求严格限制propertyTwo对应列的值类型为string,即T的结构需满足:

T {[propertyOne]: any;[propertyTwo]: string;[propertyThird]: any;[x?: string]: any}

示例调用:

const dataset = [{age: 23, name: 'josh', country: 'america'}, ...]
myFunction(dataset, 'age', 'name', 'country')

尝试添加泛型C但不知如何实现需求:

function myFunction<T, K extends keyof T, C extends string>(dataset: T[], propertyOne: K, propertyTwo: K, /* how can I use C? */ propertyThird: K): {...}
解决方案

核心思路是将三个列名拆分为独立的泛型参数,单独对第二个参数的对应值类型做约束,不需要额外的泛型C。以下提供两种实现方式:

方式1:使用条件类型约束参数(兼容所有TS版本)

直接在propertyTwo的类型上添加条件,确保它对应的T属性值是string:

function myFunction<T, K1 extends keyof T, K2 extends keyof T, K3 extends keyof T>(
  dataset: T[],
  propertyOne: K1,
  propertyTwo: T[K2] extends string ? K2 : never,
  propertyThird: K3
): { /* 你的返回类型 */ } {
  // 函数逻辑实现
}

方式2:使用where子句(TS 4.9+ 推荐)

如果你的TypeScript版本在4.9及以上,用where子句可以让泛型约束更直观:

function myFunction<T, K1 extends keyof T, K2 extends keyof T, K3 extends keyof T>(
  dataset: T[],
  propertyOne: K1,
  propertyTwo: K2,
  propertyThird: K3
): { /* 你的返回类型 */ }
where T[K2] extends string {
  // 函数逻辑实现
}

效果验证

  • 合法调用(name对应值为string):
    const dataset = [{ age: 23, name: 'josh', country: 'america' }];
    myFunction(dataset, 'age', 'name', 'country'); // 类型检查通过
    
  • 非法调用(age对应值为number):
    myFunction(dataset, 'name', 'age', 'country'); // TypeScript报错,不符合约束
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:50:46