typescript 从类型中移除未定义的

8i9zcol2  于 2023-01-14  发布在  TypeScript
关注(0)|答案(4)|浏览(163)

我使用typeof来推断函数的返回类型,但是由于我不能调用实际的函数,所以我使用了一个技巧,即使用三元运算符来推断类型,然而这给我留下了一个包含undefined的联合类型:

function foo() {
  return { bar: 1 };
}

const fooInstance = true ? undefined : foo(); // foo() is never actually called
type FooOrUndefined = typeof fooInstance;     // {bar: number} | undefined 
type Foo = ???;                               // Should be { bar: number }

有没有办法把undefinedFooOrUndefined中去掉呢?

ddrv8njm

ddrv8njm1#

您将需要使用NonNullable

type Foo = NonNullable<FooOrUndefined> // { bar: number; }

样品

zpqajqem

zpqajqem2#

如果你只想删除undefined而保留null,你可以使用一个小工具:

type NoUndefined<T> = T extends undefined ? never : T;

type Foo = number | string | null | undefined;

type Foo2 = NoUndefined<Foo> // number | string | null
d6kp6zgx

d6kp6zgx3#

ford04 pointed me to NonNullable,但我也发现ReturnType是实现我所尝试的目标的更简洁的方法:

function foo() {
  return { bar: 1 };
}
type Foo = ReturnType<typeof foo>; // { bar: number; }
lqfhib0f

lqfhib0f4#

使用类型脚本的Exclude类型实用程序类型

function foo() {
  return { bar: 1 };
}

const fooInstance = true ? undefined : foo(); // foo() is never actually called
type FooOrUndefined = typeof fooInstance;     // {bar: number} | undefined 
type Foo = Exclude<FooOrUndefined, undefined>;// { bar: number }

相关问题