请稍等 ...
×

采纳答案成功!

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

为什么要加 as any

老师再视频中演示的时候,并没有解释为什么要这样做。

  function extend<T extends object,U extends object>(first:T,second:U):T&U{
    let result = {} as T & U

    for(let id in first){
    // 这里
      result[id] = first[id] as any
    }

    for(let id in second){
      if(!result.hasOwnProperty(id)){
      // 这里
        result[id] = second[id] as any
      }
    }
    return result
  }

我觉得这里result 被 断言为 T&U类型,那就说明result包含类型T和U上的所有属性并且类型会保持一致,所以我们没理由要加上as any 啊,但是不加这句又会像视频中演示的那样报错:

Type 'T[Extract<keyof T, string>]' is not assignable to type '(T & U)[Extract<keyof T, string>]'.
  Type 'T' is not assignable to type 'T & U'.
    Type 'object' is not assignable to type 'T & U'.
      Type 'object' is not assignable to type 'T'.
        'object' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'object'.
        //...

希望老师能解答一下

正在回答 回答被采纳积分+3

插入代码

1回答

ustbhuangyi 2020-06-29 10:11:25

Type 'T' is not assignable to type 'T & U'.

重点看这句,由于是交叉类型,所以赋值给 T & U 的必须要 T 和 U 的类型都满足,而 T 不包含 U 的类型,所以会报错。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕莱坞0998854 #1
    问题就在于此,好像是T和U可以有相同的property但是对应的值的类型却不相同。我之前以为T和U的属性都不相同,所以T&U类型必然满足T类型也必然满足U类型。。。。
    回复 有任何疑惑可以回复我~ 2020-06-30 00:19:04
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号