我有以下TypeScript代码:
interface ICamera {
cameraId: number;
name: string;
state: string;
}
interface IState {
[id: number]: ICamera;
loading: boolean;
error: string | null;
}
interface ICameras {
[id: number]: ICamera;
}
在我的代码中,我收到了IState
的对象,我尝试做的是将其转换为ICameras
(即检索{{1}我的对象中的键,并忽略其他属性)
我正在做什么,并且在升级TypeScript之前工作正常,number
到最新版本是这样的:
@types/lodash
但是,现在我收到的错误表明:
private getCamerasFromState = (state: IState): ICameras =>
_.pickBy(state, (value, key) => _.isFinite(_.parseInt(key)));
无法分配给Partial<IState>
ICameras
Index signatures are incompatible
有人可以向我解释一下这里发生了什么吗?我错过了什么?这是预期的行为吗?
谢谢
答案 0 :(得分:1)
看起来wp_list_pages(array(
'child_of' => $post->post_parent,
'exclude' => $post->ID));
的类型是返回一个新对象,该对象可能包含也可能不包含原始对象的属性,这是pickBy
的作用。一个更简单的例子:
Partial
由于很难(或许不可能)通过此方法确切地知道在编译时选择了哪些键,因此TS只是让你在运行时弄清楚它
至于解决方案,我的建议是重组你的州,所以你根本不必挑出它们开始:
// obj's type is { a: number, b: number }
const obj = { a: 1, b: 2 }
// result's type is Partial<obj>, or { a?: number, b?: number }
const result = _.pickBy(obj, value => value === 1)
如果由于某种原因无法做到这一点,您可以尝试使用interface IState {
cameras: {
[id: number]: ICamera
}
loading: boolean
error: string | null
}
来删除您不想要的密钥(TS实际上可以检查这一个):
omit