gpt4 book ai didi

Typescript Declaration 合并函数和接口(interface)并导入到不同的文件

转载 作者:搜寻专家 更新时间:2023-10-30 21:37:41 25 4
gpt4 key购买 nike

如果你声明一个同名的接口(interface)和函数,然后在两种情况下都使用它, typescript 如何知道你在引用哪个?下面是一个示例:

interface Person {
name: string;
}

function Person(person : Person) {
return "Hello, " + person.name;
}

function Test(persons: Person[]) {
return persons.map(person => Person(person));
}

这是编写此代码的“最佳实践”方式吗?这在我在本地运行时有效,但我不知道这是否是您应该编写 typescript 的方式。但是 Person 接口(interface)和函数假设代表相同的东西,所以它有点有意义。 Declaration Merging解释了它如何将不同的声明合并在一起,但没有解释它将如何处理接口(interface)和函数的合并以及它代表什么。

最佳答案

该代码完全可以接受,但如果它让您感到困惑,请不要这样做。

我不知道是否有关于此的规范文档,但 typesvalues 在 TypeScript 中是不同的概念。类型名称和值名称都出现在有效的 TypeScript 代码中,但由于对它们的引用通常出现在不同的上下文中,您可以使用与值名称相同的类型,TypeScript 不会混淆( 不过,可能会感到困惑)。 TypeScript 中的类型仅存在于设计时/编译时,并从运行时代码中删除,而值通常是有效的 JavaScript 并保留在运行时代码中。如果您声明一个类型和一个具有相同名称的值,这实际上不被认为是声明合并,因为声明并没有像两个 interface 那样真正地相互作用。具有相同名称的声明。

类型和值之间的区别肯定会让那些认为他们可以做类似 function oops<T>() { new T(); } 的开发人员感到困惑。 ,没有意识到第一个 T只能引用一个类型和第二个 T必须引用构造函数值。这种混淆可能是由于某些声明确实同时创建了类型名称和值名称这一事实引起的。 class声明很大; class Foo {}使类型 Foo它引用类的一个实例,但它也使 Foo这是类的构造函数。


如果您查看 "basic concepts" chart ,您将看到哪些声明创建了哪些东西。一个interface创建一个命名类型和一个 function创建一个命名值。当你写作时

interface Person {
name: string;
}

您已经声明了一个名为 Person类型 .当你写作时

function Person(person : Person) {
return "Hello, " + person.name;
}

第一个Person正在声明一个。第二个Person是类型注解,明确指代接口(interface)声明的类型

当你写的时候

function Test(persons: Person[]) {
return persons.map(person => Person(person));
}

Person[]是一个类型注解,指的是接口(interface),而Personperson => Person(person)位于 lambda 表达式的返回值中,因此被解释为函数。


我希望我的解释对你有意义;理解类型和值之间的区别对于理解 TypeScript 至关重要。祝你好运!

关于Typescript Declaration 合并函数和接口(interface)并导入到不同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48709012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com