首页 > 解决方案 > TypeScript:如何让返回类型成为参数的类型?

问题描述

我有这样的事情:

const shiftObjValues = (obj: Object, shift: number): Object => { ... }

我有一个这样的界面:

interface Range {
  start: number;
  end: number;
}

现在,这是一个Object,当它被传递给函数时,我希望返回类型为Range

我不想as Range在使用该功能时继续这样做,但我希望它保持灵活,能够接受任何对象。

编辑:我最初想要这个没有泛型,但不明白泛型可以以不同的方式使用(如接受的答案所示)

标签: javascripttypescriptgenerics

解决方案


是的,您想使用泛型(又名类型参数)来保留传入类型。您可以使用类型约束来确保它是一个对象。

const shiftObjValues = <T extends object>(obj: T, shift: number): T => { /* ... */ }

请注意,我使用objectnot Object,就像ObjectJS 中的几乎所有内容一样,包括字符串和数字,我认为这不是您的意思。

另请注意,您不必显式传递类型参数,这意味着这可以正常工作:

let range: Range = { start: 0, end: 1 };
let shifted = shiftObjValues(range, 1);
// `shifted` is inferred as type `Range`

推荐阅读