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

使用it.each测试类成员时如何避免any类型转换?

不用any的几种实现方式

方法一:用keyof Foo约束属性类型,结合类型断言

把property的类型明确为keyof Foo,让TypeScript识别它是Foo的合法属性,无需转成any。如果偏好数组形式的test.each,可以直接添加类型约束:

class Foo {
    bar = "string"
    baz = "another-string"
}

type FooProperty = keyof Foo;

test.each<{ property: FooProperty; value: string }>([
  { property: "bar", value: "string" },
  { property: "baz", value: "another-string" },
])("$property maps to $value", ({ property, value }) => {
  const foo = new Foo();
  expect(foo[property]).toEqual(value); // 类型安全,无需any
});

如果坚持用模板字符串形式的test.each,给参数手动加类型注解即可:

test.each`
  property  | value
  ${"bar"}  | ${"string"}
  ${"baz"}  | ${"another-string"}
`("$property maps to $value", ({ property, value }: { property: keyof Foo; value: string }) => {
  const foo = new Foo();
  expect(foo[property as keyof Foo]).toEqual(value);
});

方法二:用类型守卫确保属性合法性

先校验property是否属于Foo的合法属性,TypeScript会自动缩小类型范围,无需强制转换:

class Foo {
    bar = "string"
    baz = "another-string"
}

function isFooProperty(key: string): key is keyof Foo {
  return key in new Foo();
}

test.each`
  property  | value
  ${"bar"}  | ${"string"}
  ${"baz"}  | ${"another-string"}
`("$property maps to $value", ({ property, value }) => {
  const foo = new Foo();
  if (isFooProperty(property)) {
    expect(foo[property]).toEqual(value); // 类型安全
  } else {
    fail(`Invalid property: ${property}`);
  }
});

方法三:给类添加索引签名(不推荐,仅适用于属性类型统一的场景)

如果可以修改Foo类,添加索引签名让TypeScript允许字符串索引访问:

class Foo {
    bar = "string"
    baz = "another-string"
    [key: string]: string; // 添加索引签名
}

test.each`
  property  | value
  ${"bar"}  | ${"string"}
  ${"baz"}  | ${"another-string"}
`("$property maps to $value", ({ property, value }) => {
  const foo = new Foo();
  expect(foo[property]).toEqual(value);
});

注意:如果Foo存在非string类型的属性,这种方式会导致类型冲突,谨慎使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:54:57