【问题标题】:Typescript interface type values to union typeTypescript 接口类型值到联合类型
【发布时间】:2019-04-26 22:10:39
【问题描述】:

是否可以从 typescript 中的接口获取具有所有类型值的联合类型?

例如,当一个接口被给出时

interface A {
  a: string;
  b: () => void;
  c: number;
  d: string;
  e: 'something';
}

结果应该是

type B = string | () => void | number | 'something';

我不知道如果可能的话,我将如何解决这个问题。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您可以使用keyof,例如

     type B = A[keyof A] // will be string | number | (() => void)
    

    something 类型不会出现,因为编译器不会区分 string 和 something 类型 - 因为两者都是字符串,所以它将在 type B 中省略。

    【讨论】:

    • 是的,这行得通!但我其实想知道为什么。我从未在任何地方读过,您可以将联合类型 (keyof A) 放入接口的键括号中。你知道吗,官方文档中是否提到过?
    • @PeterLehnhardt 这里发生了两件事。首先,keyof 返回A 的键。其次,A['a'] 将返回密钥 a 的类型。所以它映射键来获取它们的类型。
    • 是的,你的两件事我其实很清楚。唯一让我感到困惑的是,身份A["a" | "b"] = A["a"] | A["b"](这基本上是您答案的基本形式)是正确的并且似乎在打字稿文档中的任何地方都没有提及。 而且我觉得很奇怪,一种语言中确实存在一条潜规则!如果还有其他的怎么办?我怎么知道他们的? 所以我的问题实际上是:你从哪里知道这条规则的?
    【解决方案2】:

    你需要一些高级打字稿。

    下面的例子 keyof A 与 string | 完全可以互换。 () => 无效 |号码 | “某事”;。不同的是,如果你给 A 添加另一个属性,比如 myfunc: string,那么 keyof A 会自动更新为 string | () => 无效 |号码 |某事|myfunc。并且您可以在诸如 pluck 之类的通用上下文中使用 keyof,在这种情况下您不可能提前知道属性名称。这意味着编译器将检查您是否将正确的属性名称集传递给 pluck:

    pluck(A, ['number ', 'unknown']); // error, 'unknown' is not in string | () => void | number | 'something';
    

    可以

    let B :keyof A;
    

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 2018-10-01
      • 2020-02-25
      • 2021-06-13
      • 1970-01-01
      相关资源
      最近更新 更多