- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如果你声明一个同名的接口(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)和函数的合并以及它代表什么。
最佳答案
该代码完全可以接受,但如果它让您感到困惑,请不要这样做。
我不知道是否有关于此的规范文档,但 types 和 values 在 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),而Person
在 person => Person(person)
位于 lambda 表达式的返回值中,因此被解释为函数。
我希望我的解释对你有意义;理解类型和值之间的区别对于理解 TypeScript 至关重要。祝你好运!
关于Typescript Declaration 合并函数和接口(interface)并导入到不同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48709012/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!