请稍等 ...
×

采纳答案成功!

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

在做5-3作业出现了问题

老师,在5-3作业(数据库配置或配置项需要更新,如何实现)这道题中,在写的过程中出现了问题,为什么在T1处 this.envDbConf[this.env][data]的类型为string | number, T this.envDbConf[this.env][data]的类型为never了呢

  setConf<T extends Record<keyof DbConCof, any>>(data: DbConCof): void;
  setConf<K extends keyof DbConCof>(key: K, value: DbConCof[K]): void;
  setConf(data: any, value?: any): void {
    if (isDbConCofKey(data) && data.length > 0) {
      const temp = this.envDbConf[this.env][data]; // T1 const temp: string | number
      this.envDbConf[this.env][data] = value; // T2 不能将类型“any”分配给类型“never”。
      // (this.envDbConf[this.env][data] as any) = value;
    } else {
      this.envDbConf[this.env] = data;
    }
  }

正在回答

3回答

问题2:把 port:类型修改成 port:string 或   port: string | number 或any 或增加一个可索引类型后问题解决 ,这里有点诡异,当你 set 修改值时,拿一个 keyof DbConConf 的类型[data]放到  this.envConf[this.env][data] 这里作为 key 时 , TS 要求  keyof DbConConf所有 key  的类型要么完全相同,要么有一个兼容其他所有 其他 key 的类型。 

interface DbConConf {

  host: string

  user: string

  password: string

  port:string

  database: string

}

1 回复 有任何疑惑可以回复我~
keviny79 2023-04-05 22:43:38

问题1:      

// (1) this.envConf[this.env] 这个得到的是 dbConConf对象.  data的类型为 keyof DbConConf

      //   get  this.envConf[this.env][data]  值,

      //  TS 会按照如下方式解析类型:

      // this.envConf[this.env][data] 的类型等同于是

      // =this.envConf[this.env]["host"] 值的类型(string)+

      //  this.envConf[this.env]["user"] 值的类型 (string)+

      //  this.envConf[this.env]["port"] 值的类型 (number)+.....组成的联合类型

      const temp = this.envConf[this.env][data] // T1 const temp: string | number


1 回复 有任何疑惑可以回复我~
bjchwong 2023-04-05 19:02:43

好像是这样的QAQ:

通过index access 访问 dbConfig 的时候,可能访问的是没有定义在dbConfig的属性。
比如对下面这个接口:`DbConfig['notExist']` 'notExist' 不存在,会产生never类型。

```

interface DbConfig {

    host: string

    port: number

    user: string

    password: string

    database: string

    [key: string]: unknown // 可以添加一个索引属性,这样就可以避免报错

}

```

0 回复 有任何疑惑可以回复我~
  • 首先谢谢同学的解答! 不过这里不是这样, 进入    if (this.isDbConConfKeys(data))   data 类型已经确定为 keyof DbConConf 了。   [key: string]: unknown 之所以解决问题,是因为扩大了索引 Key 的范围,兼容了其他所有 key 的类型。
    回复 有任何疑惑可以回复我~ 2023-04-05 23:10:50
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信