请老师帮看下问题

来源:4-12 作业题:如何封装配置文件初始数据?【 真实应用题】

红帽哥布林

2022-03-08

配置文件:configData.ts

export interface configObject {
  databaseName: string;
  username: string;
  password: string;
  host: string;
  port: string;
  [key: string]: any;
}

export const configData: configObject = {
  databaseName: "sales",
  username: "username",
  password: "pwd",
  host: "192.1.1.1",
  port: "8888",
};

类文件:Config.ts

import { configData, configObject } from "./configData";

class Configs {
  static cname: string = "配置参数";
  static cself: Configs = new Configs();
  public data: configObject;

  constructor() {
    console.log("Configs类-构造器:");
    this.data = JSON.parse(JSON.stringify(configData));
    const host = this.getItem("host");
    console.log("host:", host);
  }

  public getItem(value: string) {
    if (value) {
      return this.data[value];
    }
    return undefined;
  }

  public setItem(name: string, value: string) {
    if (name && this.data[name]) {
      this.data[name] = value;
    }
    return this.data;
  }
  //重置
  public rest() {
    this.data = JSON.parse(JSON.stringify(configData));
  }
}

Configs.cself.setItem("username", "tom");
console.log("name1:", Configs.cself.getItem("username")); //name1: tom
Configs.cself.rest();
console.log("name2:", Configs.cself.getItem("username")); //name2: username
export {}; 

js下可以覆盖对象,原对象地址也可以保留。 但ts不允许覆盖,用了JSON.parse(JSON.stringify(xxx)) 来解决。但不知是否有缺陷,望老师告知更好的方式

let obj = { a: 1, b: 2 };     
let obj2 = obj;   
obj = { ax: "aa", bx: "bb" }; //覆盖对象 JS可行,ts会报错 

是不是我不应该用这样的逻辑来写?

写回答

1回答

慕移动6312711

2022-03-09

在初次let obj = { a: 1, b: 2 }的时候,类型推断已经定义obj的了类型,覆盖的话在定义obj的时候就要用混合类型进行注解了,另外一般定义引用类型的变量直接覆盖的场景比较少,我定义引用类型的变量都是直接const声明。

0
2
红帽哥布林
非常感谢!
2022-03-10
共2条回复

晋级TypeScript高手,成为抢手的前端开发人才

轻松驾驭 TypeScript 高级用法, 突破前端成长瓶颈

871 学习 · 425 问题

查看课程