请稍等 ...
×

采纳答案成功!

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

关于同时存在数字索引和字符串索引,两种类型返回值的问题

图片描述

老黄,后面的解释还能看懂,就是不理解划线那里为什么要这么定义。难道这段话当做一个知识点硬记着就行了吗?

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

1回答

ustbhuangyi 2020-12-07 17:09:04

interface NotOkay {
  [x: number]: Animal,
  [x: stirng]: Dog
}

这样为啥不行呢,举个例子 let a:NotOkay = xxx

a[0] 的类型是一个 Animal,a['0'] 的类型是一个 Dog

由于 a[0] 会自动转换成 a['0'],相当于说 Animal 是一个 Dog,显然是不合理的。而反过来就可以,因为 Dog 是一个 Animal,Dog 是 Animal 的子类型。

0 回复 有任何疑惑可以回复我~
  • 提问者 Joshua_Lee #1
    interface Okay {
      [x:number]: Dog
      [y:string]: Animal
    }
    let A:Okay = {
      '1': {
        name: '1'
      },
      1: {
        name: '1',
        color:'red'
      }
    }
    
    如上所示,这么定义会报错:不能将类型“{ name: string; color: string; }”分配给类型“Animal”, 对象文字可以只指定已知属性,并且“color”不在类型“Animal”中。
    
    不知道有没有实际的应用呢?
    
    按照" a[0] 会自动转换成 a['0']"的说法,那岂不是直接定义a['0']的类型就好了,反正 a[0]会自动转换过来,读取a['0']的类型
    回复 有任何疑惑可以回复我~ 2020-12-07 18:59:38
  • ustbhuangyi 回复 提问者 Joshua_Lee #2
    如果想支持 a[0] 和 a['0'],就定义两种类型,如果你只定义 key 为 string 类型的索引,那么 a[0] 就会报错。
    回复 有任何疑惑可以回复我~ 2020-12-08 09:48:00
  • 提问者 Joshua_Lee 回复 ustbhuangyi #3
    明白了,谢谢老黄
    回复 有任何疑惑可以回复我~ 2020-12-08 10:10:50
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信