我已经加入了打字稿旅行车,并且我想在更新我的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搞砸了。
答案 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