【问题标题】:Why an interface can't have mapped properties in typescript?为什么接口不能在打字稿中映射属性?
【发布时间】:2021-08-13 03:59:15
【问题描述】:

考虑以下枚举:

enum Numbers {
  ONE=1,
  TWO=2
}

以下接口定义引发编译时错误。

interface Config {
  [n in Numbers]: string;
}
  • 接口中的计算属性名称必须引用类型为文字类型或“唯一符号”类型的表达式。
  • 计算属性名称的类型必须为“字符串”、“数字”、“符号”或“任意”。
  • 找不到名称“n”。

但是如果我使用类型别名:

type Config = {
  [n in Numbers]: string;
}

或者将映射类型移到定义的更深处:

interface Config {
  a: {
    [n in Numbers]: string;
  };
}

它编译得很好。

那么,为什么接口的顶级属性不能是映射类型?

PS:typescript playground 使用 v4.2.3。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    TypeScript 目前不支持对接口执行此操作——我不确定是否有原因为什么除了“它尚未实现”之外它不支持。

    谢天谢地,这似乎在 TS4.4 的路线图上,通过此 PR:https://github.com/microsoft/TypeScript/pull/26797

    编辑:正如下面的 cmets 中所述,上述 PR 并未完全涵盖原始问题中所需的行为。

    【讨论】:

    • 我对“为什么这适用于类型而不适用于接口”的典型猜测通常是“关于接口合并的某些东西让这变得困难”。
    • 该 PR 不属于映射类型本身,因为您不能使属性类型依赖于索引签名中的键。像{[P in "foo" | "bar"]: Array<P>} 这样的映射类型变成{foo: "foo"[], bar: "bar"[]} 不能准确地表示为像{[key: "foo" | "bar"]: Array<???>} 这样的索引签名。
    • 最困扰我的是,将映射类型移得更深对界面有效
    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 2017-06-29
    • 2021-05-15
    • 1970-01-01
    • 2023-02-07
    • 2016-05-24
    • 2019-07-07
    • 2020-01-06
    相关资源
    最近更新 更多