用typescript中的函数扩展自定义类型

hi3rlvi2  于 2023-06-07  发布在  TypeScript
关注(0)|答案(1)|浏览(174)

我定义了以下类型:

export type A {
  id: string,
  name: string
}

export const data: A[] = [
  { id: 1, name: 'Foo' },
  { id: 2, name: 'Bar' },
  ...
]

每当我需要访问数组中的一个对象时,.find方法就派上用场了:

const id = ...; // get the ID

  data.find((entry) => entry.id === id)).name
  ...
  data.find((entry) => entry.name === name)).name

由于相同的搜索发生在代码的不同位置,我正在寻找一种方法来扩展data对象并添加自定义函数,例如:

  • findById(id: number)
  • findByName(name: string)
  • ...

我应该调用函数来获取相应的数组条目:

...
  data.findById(1).name;
  ...
  data.findByName('Foo').id;

有没有一种方法可以在typescript中扩展对象,而不必扩展原生的Object

z31licg0

z31licg01#

您可以使用Object.assign()为数组分配额外的方法。
Array.find可以返回undefined,所以它会被传递。不返回undefined的另一种选择是,你可以抛出一个异常,但这是你需要决定的。
例如。

type A = {
  id: number,
  name: string
}

const data: A[] & { 
  findById: (id:number) => A | undefined,
  findByName: (name:string) => A | undefined
} 
=  Object.assign([
  { id: 1, name: 'Foo' },
  { id: 2, name: 'Bar' },
], { 
  findById: (id:number) => data.find(a => id === a.id),
  findByName: (name:string) => data.find(a => name === a.name)
})

console.log(data.findById(1)?.name);
console.log(data.findByName('Foo')?.id);

//remember find can return undefined
console.log(data.findById(3));

TSPlayground

相关问题