我想根据对象或对象的数组作为输入来决定函数的返回类型。例如,如果输入是对象,则对象应该作为函数的返回类型。但是,如果输入是对象的数组,则数组应该作为返回类型。第一个月上面的代码显然不起作用,但我想知道是否可以使用Typescript条件类型创建此类型?
0h4hbjxa1#
在TypeScript中,您可以使用extends unknown[]测试类型是否为数组
extends unknown[]
type IfArray<T, A, B> = T extends unknown[] ? A : B;
字符串unknown[]意味着你不需要知道数组中的类型,你只需要检查类型本身是否是一个数组。另一种可能性是确保类型是数组:
unknown[]
type AsArray<T> = T extends unknown[] ? T : T[];
型
gpnt7bae2#
type ObjectOrArray<T> = T extends (infer U)[] ? U[] : T;
字符串Infer将检索数组的类型。
type Person = {firstname:string;lastname:string} type Poeple = Array<Person>; type D = ObjectOrArray<Person>; // person type C = ObjectOrArray<Poeple>; // person[]
型当你说我想根据对象或对象的数组作为输入来决定函数的返回类型。例如,如果输入是对象,则对象应该作为函数的返回类型。但是,如果输入是对象的数组,则数组应该作为返回类型。
const doNothing = <T>(param: T): T => { return param };
型泛型就可以做到这一点,你不需要任何条件类型。
const me : Person = {firstname:"romain", lastname:"taillandier"} const resultForObject = doNothing(me); // person const resultForArray = doNothing([me]); // person[]
型最后,如果需要基于一个元素或多个元素构建数组,
const buildArray = <K>(param: ObjectOrArray<K>): Array<K> => { return Array.isArray(param) ? param : [param as K]; };
ijxebb2r3#
你想根据函数的输入参数定义一个条件返回类型,根据我的经验,使用函数重载通常是个好主意。
declare function whatever<T extends Record<PropertyKey, unknown>>(arg: T): T; declare function whatever<T extends unknown[]>(arg: T): T; declare function whatever<T extends unknown[] | Record<PropertyKey, unknown>>( arg: T, ): T; const a = whatever(["some", "array"]); // ^? const a: string[] const b = whatever({ some: "object" }); // ^? const b: { some: string }
字符串TypeScript Playground
3条答案
按热度按时间0h4hbjxa1#
在TypeScript中,您可以使用
extends unknown[]
测试类型是否为数组字符串
unknown[]
意味着你不需要知道数组中的类型,你只需要检查类型本身是否是一个数组。另一种可能性是确保类型是数组:
型
gpnt7bae2#
字符串
Infer将检索数组的类型。
型
当你说
我想根据对象或对象的数组作为输入来决定函数的返回类型。例如,如果输入是对象,则对象应该作为函数的返回类型。但是,如果输入是对象的数组,则数组应该作为返回类型。
型
泛型就可以做到这一点,你不需要任何条件类型。
型
最后,如果需要基于一个元素或多个元素构建数组,
型
ijxebb2r3#
你想根据函数的输入参数定义一个条件返回类型,根据我的经验,使用函数重载通常是个好主意。
字符串
TypeScript Playground