Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >类型标命名函数表达式

类型标命名函数表达式
EN

Stack Overflow用户
提问于 2020-11-14 12:26:54
回答 2查看 441关注 0票数 1

我开始学习应用于节点JS后端的类型记录。目前,我仍然使用函数而不是类。我曾经为每个文件编写命名函数,如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const item= {
    a:1,
    b:2,
    function1:()=>{
       console.log(item.a)
    },
    function2:()=>{
       console.log(item.b)
    } }

然后导出它并像item.function1一样使用。(我有时也将其用作function1,并将导入作为非结构化对象)

现在,使用类型记录,我仍然使用这种方法,但类型。问题是,我不能将一个类型分配给a,因为它被看作是值。我不能说:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const item= {
function1:()=>{
    item.a = 3
    console.log(item.a)
},
function2:()=>{
    item.b = 4
    console.log(item.b)
}}

因为它说属性a或b在类型item中不存在。我试过的另一件事是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const item = {
function1:()=>{
    item.a:number = 3
    console.log(item.a)
},
function2:()=>{
    item.b:number = 4
    console.log(item.b)
} }

有人能帮我吗?希望这个命名的函数不是编写代码的坏习惯。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-14 12:42:29

当您声明一个变量而不指定它的类型时,类型记录将尝试推断它的类型。当您分配一个对象时,它将试图推断出这样的类型:查看您编写的属性,并考虑对象只具有这些属性和您编写的对象所具有的类型。因此,在您的上一个代码示例中,类型记录将推断出item是类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const item: {
  function1: () => void
  function2: () => void
} = {
// ...
}

您可以看到它没有添加任何其他属性。

接下来,如果在键入对象时不声明属性,类型记录将认为该属性不存在,并且可能不存在于对象上。考虑到这一点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const obj: { foo: number } = {
  foo: 6
}

obj.bar = 7 // Error

您没有声明bar属性,所以类型记录不允许读取它或给它分配一些东西。这就是为什么不能在示例中编写item.a = 3的原因:类型记录没有推断item对象具有属性a,并且它认为它不存在

要解决这个问题,只需在创建对象时分配所需的所有属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const item = {
  a: 1,
  b: 2,
  function1: () => { /* ... */ },
  function2: () => { /* ... */ },
}

或手动键入item

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Item {
  a?: number
  b?: number
  function1: () => void
  function2: () => void
}

const item: Item = {
  function1: () => {
    item.a = 3
  },
  function2: () => {
    item.b = 4
  }
}

注意界面内列之前的问号,这是为了说明这些属性是可选的。如果您不设置这些问号,类型记录会认为这是强制性的,所以如果创建item并且不声明ab属性,它会发出一个错误

票数 3
EN

Stack Overflow用户

发布于 2020-11-14 12:41:18

可以将项目object表示为any

为了实现所需的一致性,可以定义如下接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface ItemObject {
    [key: string]: any
}

var item: ItemObject= {};

使紧凑:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var item: {[k: string]: any} = {};

现在项可以接受任何字符串作为键,任何类型都可以接受为值。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64838299

复制
相关文章
命名函数表达式
好文章,可惜中文译文已经无法访问了。不过在cssrain上找到一篇:www.cssrain.cn/demo/named%20function%20expression/Named%20function%20expressions%20demystified.htm
meteoric
2018/11/15
4630
命名函数表达式探秘
本想直接转载过来的,发现效果不太好。而且想起之前好像看过中文,感谢随之漫笔的翻译,它为前端开发作出了不少贡献,很感谢这样的译者。
meteoric
2018/11/15
3110
【Kotlin】函数 ⑤ ( 匿名函数变量类型推断 | 匿名函数参数类型自动推断 | 匿名函数又称为 Lambda 表达式 )
定义变量 时 , 如果将变量值 直接赋值给该变量 , 那么就可以 不用显示声明该变量的类型 ;
韩曙亮
2023/03/30
7480
【Kotlin】函数 ⑤ ( 匿名函数变量类型推断 | 匿名函数参数类型自动推断 | 匿名函数又称为 Lambda 表达式 )
RTOS函数命名规则
函数名包含了函数返回值的类型、函数所在的文件名和函数的功能,如果是私有的函 数则会加一个 prv(private)的前缀。
小锋学长生活大爆炸
2020/08/13
1.9K0
RTOS函数命名规则
Python变量的命名_python函数命名规则
变量名只有在第一次出现的时候,才是定义变量。当再次出现时,不是定义变量,而是直接使用之前定义的变量。
全栈程序员站长
2022/08/18
1.3K0
Python变量的命名_python函数命名规则
函数类型_C语言函数类型
在ECMAScript 中有三种函数类型:函数声明,函数表达式和函数构造器创建的函数。每一种都有自己的特点。
全栈程序员站长
2022/09/20
9980
javascript事件监听中传递匿名函数(嵌套定义的命名函数)与命名函数的区别
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/51352229
空空云
2018/09/27
1.2K0
Linux命名管道及函数
管道(pipe)应用的一大局限是没有名字,只能用于具有亲缘关系进程之间的通信。而命名管道,也称FIFO,实质是一种文件类型,通过FIFO可以用于任何两个进程间的通信。
xxpcb
2020/08/04
2.7K0
【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )
函数类型格式 : 圆括号中定义 参数类型列表 , 使用 -> 由参数列表指向返回值类型 , 表示接受 参数类型列表 中的参数 , 返回 返回值类型 的返回值 ;
韩曙亮
2023/03/27
2.8K0
js匿名函数和命名函数_javascript中的函数
匿名函数在iframe里定义,而在“容器”页面执行,而$(“#map_workspace”)对象很明显在“容器”页面上,但偏偏,没有获得我们预期的结果。改为:
全栈程序员站长
2022/09/27
2.8K0
表达式树练习实践:C#值类型、引用类型、泛型、集合、调用函数
两种方式都是生成 ParameterExpression 类型 Parameter() 和 Variable() 都具有两个重载。他们创建一个 ParameterExpression节点,该节点可用于标识表达式树中的参数或变量。
痴者工良
2021/04/26
1K0
函数类型
任何函数值都符合原始类型function,它对函数的形参类型或函数返回值的类型没有任何限制。自定义函数类型值用于对符合函数值的签名设置类型限制。
冬夜先生
2022/01/05
5530
习题18:命名,变量,代码,函数
1. 首先告诉python创建一个函数,使用的命令是def,也就是定义(define)的意思
py3study
2018/08/02
4950
bitr函数_函数表达式
DWORD dwRop //指定光栅操作码,这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。
全栈程序员站长
2022/11/02
6810
[oeasy]python0070_动态类型_静态类型_编译_运行_匈牙利命名法
oeasy
2023/07/03
1490
[oeasy]python0070_动态类型_静态类型_编译_运行_匈牙利命名法
【Kotlin】函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )
函数引用 可以将 具名函数 转为 函数的参数值 , 只要可以使用 Lambda 表达式 参数的地方 , 就可以使用 函数引用 进行替代 ;
韩曙亮
2023/03/30
2.9K0
【Kotlin】函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )
【Python】类型注解 ④ ( 函数类型注解 | 函数形参类型注解语法 | 函数返回值类型注解 )
由于定义 函数 时 , 没有为 函数形参 设置 类型注解 , 编写函数时 , PyCharm 工具无法提示没有类型的形参 :
韩曙亮
2023/10/11
3820
【Python】类型注解 ④ ( 函数类型注解 | 函数形参类型注解语法 | 函数返回值类型注解 )
TypeScript函数类型
通过如下代码我们实现了一个返回值为number类型的方法,同时我们也对返回值和参数进行了约束
HueiFeng
2020/04/10
7920
TypeScript函数类型
通过如下代码我们实现了一个返回值为number类型的方法,同时我们也对返回值和参数进行了约束
HueiFeng
2020/04/09
7560
js匿名函数和命名函数_jsp调用java方法
继承,多态,甚至指针,c能实现,c++,java有,javascript(和java是雷锋和雷峰塔的区别,名字上不知道坑了多少人)也能变通实现。
全栈程序员站长
2022/11/10
6.2K0

相似问题

类型标命名

12

类型标重命名类型

12

为命名空间类型标赋值

12

类型标全局命名空间声明

13

webpack的类型标命名空间

19
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文