我有这门课:
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在加载成功后识别出配置肯定不为空?
您可以将配置的加载移至构建
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;
}