使用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
相关产品推荐
相关产品推荐

