typescript 是否可以在对象或对象数组上使用条件类型

cnh2zyt3  于 7个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(72)

我想根据对象或对象的数组作为输入来决定函数的返回类型。例如,如果输入是对象,则对象应该作为函数的返回类型。但是,如果输入是对象的数组,则数组应该作为返回类型。
第一个月
上面的代码显然不起作用,但我想知道是否可以使用Typescript条件类型创建此类型?

0h4hbjxa

0h4hbjxa1#

在TypeScript中,您可以使用extends unknown[]测试类型是否为数组

type IfArray<T, A, B> = T extends unknown[] ? A : B;

字符串
unknown[]意味着你不需要知道数组中的类型,你只需要检查类型本身是否是一个数组。
另一种可能性是确保类型是数组:

type AsArray<T> = T extends unknown[] ? T : T[];

gpnt7bae

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];
};

ijxebb2r

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

相关问题