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

来源:5-3 如果数据库配置或配置项需要更新,如何实现?

淡蓝色yao丸

2023-04-03

老师,在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回答

keviny79

2023-04-05

问题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
1
淡蓝色yao丸
非常感谢!
2023-04-06
共1条回复

keviny79

2023-04-05

问题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
0

bjchwong

2023-04-05

好像是这样的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
1
keviny79
首先谢谢同学的解答! 不过这里不是这样, 进入 if (this.isDbConConfKeys(data)) data 类型已经确定为 keyof DbConConf 了。 [key: string]: unknown 之所以解决问题,是因为扩大了索引 Key 的范围,兼容了其他所有 key 的类型。
2023-04-05
共1条回复

前端高手养成计划-从前端到后端,全栈开发大型项目

从纯前端到“真正懂后端的前端”

215 学习 · 134 问题

查看课程