请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于混合类型

老师在讲到混合类型的时候,有这么一句代码:

let counter = (function(start:number){}) as Counter
counter.interval = 123
counter.reset = function(){}

我不理解这里为什么要使用类型断言,所以我试着写成一般人的思路:

let counter:Counter
counter = function(start:number){}
counter.interval = 123
counter.reset = function(){}

但是居然报错了,报错信息为 Type ’ (start:number) => void ’ is not assignable to type ‘Counter’ property ‘reset’ is missing in type (start:number) => void

问题有两个:
1>为什么这样写是错误的?
2>我可能有一种错觉,觉得类型断言还是少用一点比较好,什么时候用比较合适呢?

正在回答

1回答

1. 首先,function(start:number){} TS 会把它推断为类型 (start:number) => void,然后这个类型是不具备 interval 和 reset 属性的,所以报错。其次,Counter 类型是有这俩属性的,所以你只要把这个函数断言成 Counter,就可以添加这俩属性。
2. 类型断言尽量少用,不过也有它的场景,这部分你后面学习实战的时候就会接触到几个场景。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕莱坞0998854 #1
    可是我已经写了 let counter : Counter 这一句了啊,这还不能说明counter是Counter类型的吗?还必须的用断言?
    回复 有任何疑惑可以回复我~ 2019-06-26 17:42:14
  • ustbhuangyi 回复 提问者 慕莱坞0998854 #2
    let counter : Counter 说明 counter 是 Counter 类型,然后你再 counter = function(start:number){} 做赋值,显然  function(start:number){}  不满足 Counter 类型,当然报错啊。
    就好比 let a:string 然后 a = 1,不报错吗?
    回复 有任何疑惑可以回复我~ 2019-06-27 09:28:21
  • 提问者 慕莱坞0998854 #3
    谢谢老师!
    回复 有任何疑惑可以回复我~ 2019-06-28 10:56:08
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信