【问题标题】:Convert interface into Function parameters in Typescript在 Typescript 中将接口转换为函数参数
【发布时间】:2021-01-30 00:00:31
【问题描述】:

我想知道的是是否可以使用接口来描述需要传递给函数的参数。一个例子如下:

  interface Person {
      name: string;
      age: number;   
  }

  function createPerson(name: string, age: number) {}

我想使用 Person 接口作为 createPerson 参数的参考。到目前为止,我一直在使用这个:

function createPerson(name: Person['name'], age: Person['age']) {}

虽然总比没有好,但我仍然不知道这是否是我这样做的最佳方式,因为我仍然需要重写所有参数名称。有更好的选择吗?提前致谢。

【问题讨论】:

  • 这不是你实际的问题的答案,而是:你考虑过接受一个对象吗?例如,function createPerson(person: Person)(或function createPerson({name, age}: Person)

标签: javascript typescript function types interface


【解决方案1】:

您可以使函数接受 1 个对象而不是 2 个单独的参数。例如,您可以这样做。

function createPerson(p: Person) {}

【讨论】:

    【解决方案2】:

    我 99.9% 确信没有办法像这样“传播”接口的类型定义,尤其是因为接口没有顺序,而函数参数有。

    您可以执行问题中显示的操作,也可以直接接受 Person 对象:

    function createPerson(person: Person) { /* ... */ }
    

    或解构:

    function createPerson({name, age}: Person) { /* ... */ }
    

    无论哪种方式,你都可以用一个对象来调用它,例如:

    const createdPerson = createPerson({name: "Aylton Almeida", age: 20});
    

    【讨论】:

    • 是的,我一直在寻找这个“传播”​​界面或类似的东西。对我来说,接受整个对象不是一个好选择,但总比没有好。 Tnks。
    • @AyltonAlmeida - 我今天自己也想要这个并且想知道......TypeScript 是如此的灵活......也许有什么......?所以我联系了 TypeScipt 专家 Titian Cernicova Dragomir,他确认没有办法做到这一点(至少,在 TypeScript 构建中没有什么可以依赖的)。
    • @AyltonAlmeida - FWIW,您可以通过Parameters utility type 走另一条路(稍微)。所以如果你有(比如)function foo(a: string, b: number): string;,那么type FooParameters = Parameters<typeof foo> 就是元组类型[a: string, b: number](一个带标签的元组,但是你不能在类型系统或代码中访问元组标签)。
    猜你喜欢
    • 1970-01-01
    • 2018-10-27
    • 2019-06-15
    • 1970-01-01
    • 2017-10-09
    • 2017-04-25
    • 2021-01-17
    • 2018-09-15
    相关资源
    最近更新 更多