Typescript的接口(interface)、函数(function)和命名空间(namespace)都有相同的名称。哪个正在被导出?

26

{{link1:在我正在检查的Typescript定义文件(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;

哪一个是在导出?是接口、函数还是命名空间?
这有什么意义吗?
在同一作用域/命名空间中,如何给多个事物取相同的名称?

4
看一下声明合并——它会导出所有东西——我不会使用接口调用签名。仅使用重载函数更清晰。(没有时间进行完整回答) - Gerrit0
@Gerrit0 如果签名不同,我会理解,但是接口和声明的函数具有完全相同的签名。此外,由接口创建的类型实际上从未被使用过。其中之一是多余的,对吗? - Knu
当您尝试使用合并类型声明与 typeof 运算符时,您将会感受到很多乐趣。它似乎具有某种层次结构,应该为该运算符返回类型,但是由于未知性而难以预测。 - fires3as0n
4个回答

1

扩展@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;


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

枚举不能与接口合并。 - fires3as0n

0

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community
虽然此链接可能回答了问题,但最好在此处包括答案的关键部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会变得无效。- 来自审查 - Andrew Halil

0

基本上,它定义了同时具备以上所有条件的某个东西。我添加了一个新答案,为您提供ts playground链接,希望能对您有所帮助。


-2
他们刚刚创建了一个跑步-运动包的东西。没关系,这不是你的代码。基本上,他们导出了一个包含所有这些功能的东西。就像你可以在JavaScript中做到这一点:
function foo() {};
foo.bar = function() {};

看看这个ts playground code


但是他们不仅仅是导出一个带有一堆属性的对象。他们正在创建许多具有相同名称的东西。 - CodyBugstein
他们并没有真正创造任何东西。他们只是声明了事物的形状。有一种叫做Twilio的形状适用于所有描述的用途,并且它可以帮助TypeScript理解它当前正在处理的内容。如果您使用实际的命名空间,实现将是一个具有特定类型和参数的函数,它将具有一个也是函数的属性,并且它具有在命名空间中描述的所有导出属性。所以这是一个函数-函数容器-属性桶的东西。但是这些声明只是存在的声明。 - JGoodgive
但是有三个完全不同的“东西”被声明为 twilio。这不像只有一个形状定义,然后是实现。我可以理解那样的情况。这里有3个单独的声明。 - CodyBugstein
我不明白。我一直在评论区回答你,但是它们被删除了或者发生了什么事情?第三次:它们不是“物品”,而是像物品的形状。所以他们说的是,如果有一个真正的“twilio”物品,那么这个物品将是一个具有另一个函数属性以及其他属性集合的函数-函数包-属性包物品。 - JGoodgive
1
好的,翻译成中文后,这些声明的意思是“如果有人创建了一个名为twilio的函数,它将会长成这个样子;如果它是一个接口,它将会长成这个样子;如果它是一个命名空间,它将会长成这个样子”,对吗? - CodyBugstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接