【问题标题】:Typescript interface, function and namespace all have the same name. Which is being exported?Typescript 接口、函数和命名空间都具有相同的名称。哪个出口?
【发布时间】:2018-06-27 03:05:20
【问题描述】:

In the Typescript definition file (DefinitelyTyped)我正在检查,有一个接口、一个函数和一个命名空间都具有完全相同的名称:twilio

这是文件前几行的示例:

declare interface twilio {
  (sid?: string, tkn?: string, options?: twilio.ClientOptions): twilio.RestClient
}

declare function twilio(sid?: string, tkn?: string, options?: twilio.ClientOptions): twilio.RestClient;

declare namespace twilio {
 ....

然后一直到它说的文件底部

export = twilio;

那么它出口的是哪一个?界面?功能?命名空间? 这有什么意义?如何在同一个作用域/命名空间中将多个事物命名为完全相同的名称??

【问题讨论】:

  • 看看declaration merging - 它正在导出所有内容 - 我不会使用接口调用签名。只有重载函数更清楚。 (没有时间给出完整的答案)
  • @Gerrit0 我知道签名是否不同,但接口和声明的函数具有完全相同的签名。此外,接口创建的类型从未实际使用过。两者之一是多余的,对吗?

标签: typescript module definitelytyped typescript-definitions .d.ts


【解决方案1】:

他们刚刚创建了一个跑步者跑步运动包的东西。没关系,它不是你的代码。基本上他们出口的东西就是以上所有的东西。就像您可以在 javascript 中执行此操作一样:

function foo() {};
foo.bar = function() {};

看看这个ts playground code

【讨论】:

  • 但它们并不是简单地导出具有一堆属性的对象。他们正在创造许多同名的东西
  • 他们并没有真正创造任何东西。他们在宣告事物的形状。有一种称为 twilio 的形状适合所描述的所有用途,它可以帮助 typescript 了解它当前正在使用的内容。如果您曾经使用实际的命名空间,则实现将是具有特定类型和参数的函数,它将具有一个也是函数的属性,并且它具有命名空间中描述的所有导出属性。所以它是一个function-functionContainer-propertyBucket的东西。但声明只是......将存在的声明。
  • 但是有三个完全不同的“事物”被声明为twilio。这不像只有一个形状定义,然后是一个实现。我会得到的。这有 3 个单独的声明
  • 我不明白。我一直在 cmets 在这里回答你,它被删除了还是什么?第三次:它们不是“东西”,它们就像事物的形状。所以他们说的是,如果有一个真正的“twilio”东西,那么那个东西将是一个函数,它具有另一个函数属性以及它上面的其他属性的集合。那东西将是一个function-functionBag-propertyBag的东西。
  • (也许你的互联网连接有问题?)好吧,翻译成英文,声明的意思是“如果有人做了一个名为 twilio 的函数,它看起来像这样,如果它是一个接口,它看起来像像这样,如果它是一个命名空间,它看起来像这样”?
【解决方案2】:

基本上,它同时定义了上述所有内容。我添加一个新答案给您link to ts playground,希望对您有所帮助。

【讨论】:

    【解决方案3】:

    官方的打字稿文档称之为“declaration merging”。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    【解决方案4】:

    展开@ppp回答

    声明合并是 TypeScript 编译器将两个或多个类型合并到一个声明中,前提是它们具有相同的名称。

    要记住的重要一点是:类与类不能合并。

    所以只允许例如合并:

    interface User {
      name: string;
    }
    
    interface User {
      age: number;
    }
    
    interface User {
      height: number;
    }
    
    class Person implements User {
      name = "John"
      age = 30;
      height = 180
    }
    
    enum User {...}
    
    namespace User {...}
    
    const person = new Person();
    console.log(person) // {name: "John", age: 30, height: 180}
    
    export person;
    
    

    所以要回答你的问题,你可以像上面的例子一样导出单一类型,其余的声明在它们之间合并

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 2018-11-04
      • 2016-01-04
      • 1970-01-01
      • 2017-12-23
      相关资源
      最近更新 更多