在做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回答
-
问题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
}
112023-04-06 -
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
10 -
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 // 可以添加一个索引属性,这样就可以避免报错
}
```
012023-04-05
相似问题