TypeScript:按变量关键字对对象数组排序,其中关键字可能是可选的

aurhwmvo  于 2022-12-01  发布在  TypeScript
关注(0)|答案(1)|浏览(154)

我有一个类型和一个该类型的对象数组。“不幸的是”该类型中的一些键是可选的。这破坏了我的动态排序函数。我如何使它工作呢?我不会用这些可选键调用它,所以如果函数在这种情况下不排序或排序错误也是可以的。

export type Test = {
  adam: string;
  eve?: string;
};

export type Container = {
  test: Array<Test>;
};

const testContainer = {} as Container;
export function sortTest(prop: keyof Test) {
  testContainer.test.sort((a, b) => {
    if (a[prop] === undefined || b[prop] === undefined || !(prop in b) || !(prop in a)) {
      return 0;
    } else {
      return a[prop] > b[prop] ? -1 : b[prop] > a[prop] ? 1 : 0;
    }
  });
}

正如你所看到的,我尝试了两种不同的方法来确保propab的一部分。这两种方法都不起作用。我总是得到ts 2532 -对象可能在实际的排序行上“未定义”。
链接到Playground

9w11ddsr

9w11ddsr1#

需要将a[prop]b[prop]保存到变量中:

testContainer.test.sort((a, b) => {
  const aProp = a[prop];
  const bProp = b[prop];
  if (aProp === undefined || bProp === undefined) return 0;
  return aProp > bProp ? -1 : bProp > aProp? 1 : 0;
});

从这里:
这实际上并不是专门针对TS 2532,而是针对一般的类型收缩--TS不会将任何涉及obj[key]的检查视为类型保护,除非key是一个文字。

相关问题