TypeScript中的Lodash pickBy给出了错误:索引签名不兼容

时间:2018-06-14 18:41:52

标签: typescript lodash typescript-typings typescript2.0

我有以下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

有人可以向我解释一下这里发生了什么吗?我错过了什么?这是预期的行为吗?

谢谢

1 个答案:

答案 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