在写单元测试中,我想抽象一个通用的函数,避免重复书写。函数的定义如下:
export function defineUnitTest<R> ( name: string, fn: (...args: any) => R, // 这里 source 参数的类型应该对应 fn 函数的参数类型 source: any, expected: R,) { it(name, () => { expect(fn(...source)).toEqual(expected); });}declare function twoSum (nums: number[], target: number): number[];// 使用这个函数时,第三个参数的类型应该是通过第二个参数推断出来的。defineUnitTest("some desc", twoSum, [[2, 7, 11, 15], 9], [0, 1]);
但是我不知道如果建立 fn 函数参数的类型和 source 类型之间的联系。
请问要怎么写才可以让 source 的类型等于 fn 参数类型的数组?
ts只能做静态类型检查; 这里只能用泛型处理一下;
export function defineUnitTest<F extends (...arg: any[]) => any>( name: string, fn: F, source: Parameters<F>, expected: ReturnType<F>,) { }declare function twoSum(nums: number[], target: number): number[];defineUnitTest<typeof twoSum>('abc', twoSum, [[1, 2], 1], [])
Parameters
和ReturnType
是TS内置的工具类型,获取函数的参数类型和返回值类型的
可以使用内置的 Parameters 和 ReturnType 方法定义参数。
export function defineUnitTest<T extends (...args: any[]) => any> ( name: string, fn: T, source: Parameters<T>, expected: ReturnType<T>,) { it(name, () => { expect(fn(...source)).toEqual(expected); });}
每个参数的类型为string | string[] 如何能统一改成string呢? 用const sceneId = route.query.sceneId as string可以实现,但是每个参数都得这样写一遍吗?
想实现value是string那么val就是string,value是string[]那么val就是string[]
TypeScript 类型检查机制包含三个部分: 类型推断 类型保护 类型兼容性 本节介绍其中的类型推断,类型推断主要用于那些没有明确指出类型的地方帮助确定和提供类型,这是 TypeScript 的一种能力。 类型推断是有方向的,要注意区分从左向右和从右向左两种推断的不同应用。 1. 慕课解释 类型推断的含义是不需要指定变量类型或函数的返回值类型,TypeScript 可以根据一些简单的规则推断其
让我们分析下面的代码片段: 以上代码不会引发任何错误。我希望它会抛出构造函数调用,在这里我传递5。 似乎构造函数的参数被推断为,其中,静态地很容易发现我将其分配给。 问题是:TypeScript在这里允许,或者换言之,被推断为,而在这种情况下,很明显它必须是一个字符串,这有什么特殊的原因吗? 我知道我可以做另一个这样的类定义: 但这里我指定了参数类型,所以这里没有推断。我也可以这样做: 也不会有任
我有一个类,它有一些属性/方法,返回最初通过构造函数传递的值: 人们建议用泛型作为打字稿的等价物: 现在我有了一个子类,它调用超类的构造函数并传递以下选项: TypeScript编译器对此不满意,希望通过类型扩展Base类。但是我有两次信息,在超级呼叫和扩展符号中。什么是正确的ts语法来解决我的问题? (键入脚本中的代码)