【问题标题】:How to declare TypeScript object interface that has exact fields and any extra properties如何声明具有精确字段和任何额外属性的 TypeScript 对象接口
【发布时间】:2016-05-18 10:21:34
【问题描述】:

我在声明 Redux Action Type 时确实遇到了一些问题。根据定义,Redux Action应该type属性并且可以有一些其他的属性。

根据 TypeScript interfaces page in HandBook(参见“Excess Property Checks”)我可以这样做:

interface IReduxAction {
  type: string;
  [propName: string]: any;
}

而且似乎在某些情况下也有效(比如声明变量)

const action: IReduxAction = {
  type: 'hello',
  value: 'world'
};

但如果我试图声明正在使用该操作的函数:

function hello(state = {}, action: IReduxAction) {
  return { type: action.type, text: action.text };
}

失败并显示消息“IReduxAction 类型上不存在属性 text”。

我做错了什么?通用动作类型如何声明?

TypeScript Playground 上的实时示例是 here

附:我检查了“类似”的问题,例如Why am I getting an error "Object literal may only specify known properties"?,但还没有找到解决方案……

附言显然它确实在最新版本的 TypeScript 中工作。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    在您引用的同一页面中,它在标题为 Indexable Types 的部分中谈到了它。

    您需要这样做:

    function hello(state = {}, action: IReduxAction) {
        return { type: action.type, text: action["text"] };
    }
    

    因为您的接口定义被定义为具有从字符串(键)到任何(值)的索引。

    【讨论】:

    • 我也阅读了该部分。并且随着您的更改,它可以正常工作。问题是 - 我不想在这里使用非点符号。它是正常的 JavaScript 表示法,应该可以让它以某种方式工作......问题是 - 如何?
    • 据我所知,这就是 typescript 区分已知字段和可索引字段的方式。
    猜你喜欢
    • 2020-10-30
    • 2018-07-04
    • 2021-09-19
    • 1970-01-01
    • 2021-01-09
    • 2020-03-02
    • 2019-09-30
    • 2020-03-14
    • 2019-05-28
    相关资源
    最近更新 更多