打字稿+不变性助手#set

时间:2018-11-30 11:28:51

标签: javascript typescript visual-studio-code immutability-helper

我已经加入了打字稿旅行车,并且我想在更新我的redux存储时继续使用这个不可变帮助程序库,但是由于某些原因,现在我在尝试执行更新时遇到此错误?:

  

[ts]类型'{的参数标志:{hideChat:{$ set:boolean; }; }; }'   不能分配给'Spec'类型的参数。   对象文字只能指定已知属性,而“标志”不能指定   类型为“规范”。

export interface GlobalStateInit {
  flags: {
    hideChat: boolean
  }
}

const initialState: GlobalStateInit = {
  flags: {
    hideChat: false
  }
}

const reducer: Reducer<GlobalStateInit, GlobalAction> = (state = initialState, action) => {
  switch (action.type) {
    case getType(actions.toggleChat):
      return update(state, {
        flags: {
          hideChat: { $set: !state.flags.hideChat }
        }
      })
    default:
      return state
  }
}

export { reducer as GlobalReducer }

我当时认为这应该是微不足道的,并且应该开箱即用,我在后台运行的开玩笑的测试可以弄清楚这一点,但是VScode TS Linter有点生气。

不确定这是错误还是只是VScode搞砸了。

1 个答案:

答案 0 :(得分:0)

这是蓄意的编译器功能。这是相同问题的简短版本:

interface Example {
    name: string,
    val: number
}

const example: Example = {
    name: 'Fenton',
    val: 1,
    more: 'example'
}

more属性不是Example接口的一部分,因此编译器将警告您可能犯错了。例如,如果有一个键入错误的可选成员,它将为您找到该成员:

interface Example {
    name: string,
    val: number,
    side?: string
}

const example: Example = {
    name: 'Fenton',
    val: 1,
    sdie: 'Left' // Oops, I meant "side"
}

在您认为自己比编译器更懂的情况下,您可以告诉您由您负责:

interface Example {
    name: string,
    val: number
}

const example = {
    name: 'Fenton',
    val: 1,
    more: 'example'
} as Example

这允许其他成员,同时仍然确保您不会犯以下错误:

// Lots of errors!
const example = {
    more: 'example'
} as Example