如何“更新”Typescript 中的类型?

问题描述 投票:0回答:1

我有这门课:

type Config = {
    magic: string;
};

class ConfigManager {
    private readonly configPath: string;
    private config: Config | null;

    public constructor(configPath: string) {
        this.configPath = configPath;
        this.config = null;
    }

    public loadConfig() {
        try {
            this.config = /* read file and parse json */ ;
            return true;
        } catch {
            return false;
        }
    }

    public getConfig(): Readonly<Config> | null {
        return this.config;
    }
}

最初,配置未加载,因此类型为

T | null
。但加载后应该只是
T
。不幸的是,在当前的设置下,它无法识别这一点。

function main() {
    const configManager = new ConfigManager("./run/configs/config.json");
    if (!configManager.loadConfig()) {
        return 1;
    }

    console.log(configManager.getConfig().magic); // Object is possibly null
    return 0;
}

main();

是否可以让Typescript在加载成功后识别出配置肯定不为空?

typescript types type-inference
1个回答
0
投票

您可以将配置的加载移至构建

ConfigManager
之前,例如作为静态方法。

class ConfigManager {
    private config: Config;

    public constructor(config: Config) {
        this.config = config;
    }

    public static loadConfig(configPath: string) {
        try {
            return new ConfigManager(/* read file and parse json */);
        } catch {
            return null;
        }
    }

    public getConfig(): Readonly<Config> | null {
        return this.config;
    }
}

function main() {
    const configManager = ConfigManager.loadConfig("./run/configs/config.json");
    if (!configManager) {
        return 1;
    }

    console.log(configManager.getConfig().magic);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.