泛型中的 typescript 标记联合

标签 typescript discriminated-union

如何让这个编译没有错误?我们使用的是 TypeScript 2.9.1。

interface IFoo {
  type: 'foo';
  foo: string;
}

interface IBar {
  type: 'bar';
  bar: string;
}

type FooBar = IFoo | IBar;

class Getter<T extends FooBar> {
  private data: T;

  constructor(data: T) {
    this.data = data;
  }

  public getMe(): string {
    const { data } = this;
    // Property 'foo' does not exist on type 'T'.
    // Property 'bar' does not exist on type 'T'.
    return data.type === 'foo' ? data.foo : data.bar;
  }
}

最佳答案

编译器不会缩小具有类型参数类型的变量。您可以显式键入变量,这将使代码进行编译:

 public getMe(): string {
    const data :FooBar = this.data;
    return data.type === 'foo' ? data.foo : data.bar;
}

关于泛型中的 typescript 标记联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50819907/

相关文章:

typescript - 如何在 Typescript 中重新定义 window.addEventListener 的类型?

f# - 是否可以对受歧视联合的基础形状进行模式匹配?

f# - 从 F# DU 访问特定案例

f# - F# 中是否存在与 DU 的 [<RequireQualifiedAccess>] 属性等效的 OCaml?

reflection - 如何从 Case 实例中获取 Discriminated Union Type?

typescript - 带有 TypeScript 转译器的 JSPM bundle

javascript - 是否有任何通用方法可以将四个数组值转换为javascript中的对象数组

javascript - 命名空间方法不是函数

reactjs - 如何在 Storybook 中添加样式 Prop 作为控件?

f# - 用可区分联合和记录类型表示浮点