; type Y = Promise<{ field: number }>; type Z = Promise>; type cases = [ Expect, string>>, Expect, { field: number }>>, Expect, string | number>> ]; // @ts-expect-error type error = MyAwaited; // ============= Your Code Here ============= type MyAwaited | Promise> = T extends Promise ? R extends Promise ? MyAwaited : R : never;"> ; type Y = Promise<{ field: number }>; type Z = Promise>; type cases = [ Expect, string>>, Expect, { field: number }>>, Expect, string | number>> ]; // @ts-expect-error type error = MyAwaited; // ============= Your Code Here ============= type MyAwaited | Promise> = T extends Promise ? R extends Promise ? MyAwaited : R : never;"> ; type Y = Promise<{ field: number }>; type Z = Promise>; type cases = [ Expect, string>>, Expect, { field: number }>>, Expect, string | number>> ]; // @ts-expect-error type error = MyAwaited; // ============= Your Code Here ============= type MyAwaited | Promise> = T extends Promise ? R extends Promise ? MyAwaited : R : never;">
// ============= Test Cases =============
import type { Equal, Expect } from "./test-utils";

type X = Promise<string>;
type Y = Promise<{ field: number }>;
type Z = Promise<Promise<string | number>>;

type cases = [
  Expect<Equal<MyAwaited<X>, string>>,
  Expect<Equal<MyAwaited<Y>, { field: number }>>,
  Expect<Equal<MyAwaited<Z>, string | number>>
];

// @ts-expect-error
type error = MyAwaited<number>;

// ============= Your Code Here =============
type MyAwaited<T extends string | Record<string, any> | Promise<any>> = T extends Promise<infer R>
  ? R extends Promise<any>
    ? MyAwaited<R>
    : R
  : never;

简单递归,不需要的分支使用 never最后联合时去除。