typescript 类型脚本:扩展函数参数

zfycwa2u  于 2023-01-10  发布在  TypeScript
关注(0)|答案(3)|浏览(187)

我想知道是否有一种(有效的)方法可以在不使用新变量的情况下扩展隐式参数的类型,
例如:

;[{ firstName: "John", lastName: "Smith" }]
.map( person => {
  const newPerson = person as typeof person & { name: string }
  newPerson.name = `${newPerson.firstName} ${newPerson.lastName}`
  return newPerson
}

就像...

.map( (person: person & { name: string } ) => ...

我能用仿制药吗?

xzabzqsa

xzabzqsa1#

您可以定义一个新的类型,供以后使用。

type NewPerson = Person & {name: string}

我觉得最好的办法是把Map还给我,

const newPersons: NewPerson[] = persons.map(person => {
   const {firstName, lastName} = person;
   const newPerson = {...person, name: `${firstName} ${lastName}`};
   return newPerson;
})

这样做的好处是,由于您已经定义了类型,如果发生任何更改,则类型脚本将忽略使用map返回的数组的错误。

x7yiwoj4

x7yiwoj42#

您需要的不是扩展函数参数,而是使用自己的返回值,这正是Array.prototype.map的作用。因此,map在TypeScript中的类型如下:

interface Array<T> {
  // ...
  map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];
  // ...
}

U可以从map回调参数中推断出来,因此只需使用TypeScript的推断功能:

const mapped = [{ firstName: "John", lastName: "Smith" }]
  .map((person) => ({ ...person, name: `${person.firstName} ${person.lastName}` }));

type Mapped = typeof mapped; // type Mapped = { name: string; firstName: string; lastName: string; }[]

TypeScriptPlayground

von4xj4u

von4xj4u3#

不使用新变量扩展隐式参数的类型
否,无论类型是推断的还是显式的,TypeScript都会将任何额外的属性视为潜在的输入错误
“变通方法”实际上是重新键入(类型Assert)或创建一个新变量,这显式地告诉TypeScript额外的成员是有意的。
对于经验丰富的JavaScript开发人员来说,这看起来像是一个障碍,因为自由添加新属性是他们的一个非常常见的做法。
这是TypeScript迫使您编写与普通JS完全不同的代码的少数情况之一。
在这里,它更像是一个烦恼,而不是一个关键的限制,因为变通方案非常简单(顺便说一句,在JS中,您可以使用forEach代替,因为您“返工”项目,而map已经在语义上指向TS解决方案,正如GuerricP的答案所解释的那样)。
您可以将其视为类型显式性的代价。

相关问题