【问题标题】:How to type chained calls to a Typescript object如何键入对 Typescript 对象的链式调用
【发布时间】:2021-09-28 17:30:00
【问题描述】:

我需要创建一个翻译系统,其中元素位于 Typescript 对象中,如下所示:

const fr: AppMessages = {
  builder: {
    actionButtons: {
      preview: 'Visualisation',
      ...
    },
  },
};

所以我用这种类型输入了对象:

interface AppMessages extends Record<string, string | AppMessages> {}

但是当我想读取一个子键时:

const test: string = fr.builder.actionsButton.preview;

Typescript 向我显示此错误:TS2339: 属性 'actionsButton' 在类型 'string | 上不存在应用消息”。 “字符串”类型上不存在属性“actionsButton”。

是否可以让它告诉我中间键返回特定类型,在这种情况下builder 返回AppMessages 而不是string,或者是我需要以不同方式编写的类型?

感谢您的回复!

【问题讨论】:

    标签: typescript


    【解决方案1】:

    如果您的整个消息对象是静态声明的,您可以只使用const assertion

    const fr  = {
      builder: {
        actionButtons: {
          preview: 'Visualisation'
        },
      },
    } as const;
    
    const t = fr.builder.actionButtons.preview;
    

    【讨论】:

    • 这是个好主意,这看起来确实像静态数据。
    • 所以解决方法是不键入起始对象,因为通过使用 const 断言我们不键入对象,我们只是告诉它它是只读的?
    • 这是一种说法,即整个对象按照声明的方式进行狭义类型化,并且无法更改。
    • @Robby Cornelissen 好!我不知道这个功能!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 2022-11-19
    • 1970-01-01
    • 2021-09-16
    • 2021-08-27
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    相关资源
    最近更新 更多