0

我来加入打字稿旅行车,我想在更新我的 redux 商店时继续使用这个 immutability-helper lib,但由于某种原因,现在我在尝试执行更新时收到此错误?:

[ts] 类型参数 '{ flags: { 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 搞砸了。

4

1 回答 1

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
于 2018-11-30T11:53:06.707 回答