typescript 使用参数值进行推理

syqv5f0l  于 2023-02-20  发布在  TypeScript
关注(0)|答案(2)|浏览(115)
class Foo1 {
  a: number = 42
}

class Foo2 {
  a: string = "foobar"
}

type Format = "foo1" | "foo2"

function foo(format: Format) {
  if (format === "foo1") return new Foo1();
  return new Foo2()
}

const f = foo("foo1");

这里,f被推断为Foo1Foo2,即使我知道它严格地是Foo1
是否可以在foo中编写一些泛型注解来帮助它推断返回类型?

c9qzyr3d

c9qzyr3d1#

您可能希望在这里使用重载,其中每个选项都有一个函数签名,并且显式设置了该选项的返回类型。

function foo(format: 'foo1'): Foo1
function foo(format: 'foo2'): Foo2
function foo(format: Format) {
  if (format === "foo1") return new Foo1();
  return new Foo2()
}

const f = foo("foo1"); // Foo1

见Playground

c86crjj0

c86crjj02#

我的错,这并不难:

function foo(format: "foo1") : Foo1;
function foo(format: "foo2") : Foo2;
function foo(format : Format) {
  if (format === "foo1") return new Foo1();
  return new Foo2()
}

注意,如果我想让类型处理Format类型(比如“foo1”或“foo2”,比如变量),我必须添加另一个覆盖签名:

function foo(format: Format) : Foo1 | Foo2;

相关问题