Чтобы отличить другие ответы, предоставив другой возможный способ, вы можете установить тип возвращаемого значения Config|ChildConfig
.
interface ChildConfig {
x: number;
y: number;
}
interface Config {
[name: string]: ChildConfig;
}
const config = {} as any;
function getConfig(name?: string): Config|ChildConfig {
if (name) return config[name];
return config;
};
Использование потребует от вас явного решения, является ли тип возвращаемого значения Config
или ChildConfig
, например:
const childConfig = getConfig('myTest') as ChildConfig;
Таким образом childConfig
будет иметь тип ChildConfig
.
В противном случае вы можете комбинировать такой механизм с защитными приспособлениями (подробнее здесь )
function isChildConfig(arg: any): arg is ChildConfig {
return arg && arg.x && arg.y;
}
Затем используйте тип guard на результате, чтобы продолжить, только если это дочерняя конфигурация:
const _config = getConfig('test');
if (isChildConfig(_config)) {
_config. // <-- intellisense here
}
Это обеспечит наличие у _config свойств x
и y
:

TS Playground