Динамический тип в зависимости от переданных значений объекта
У меня есть функция
interface IargsDef {
name: string;
default?: string;
}
function parseArgs(argsDef: IargsDef[], splitedString: string[]) {
const parsedArgs: parseResults = {
_: [],
};
if (argsDef.length > 0) {
argsDef.forEach((arg: IargsDef) => {
if (parsedArgs[arg.name] !== undefined) return;
const value = splitedString.shift();
parsedArgs[arg.name] = value || arg.default || " ";
});
}
if (splitedString.length > 0) parsedArgs._ = splitedString;
return parsedArgs;
}
Пример возвращаемого значения
const splitedString: string[] = ["some", "args", "test"]
const argsDef: IargsDef[] = [{
name: "command",
},
{
name: "test"
}
]
const result = parseArgs(argsDef, splitedString)
------------------
result = {
_: ["test"],
command: "some",
test: "args"
}
Она проходит по массиву с именами аргументов и по значению ключа name создает новое свойство в объекте parsedArgs и присваивает ему значение из splitedString и если его нет, то стандартное, либо пустую строку. Если в splitedString еще остались элементы, то все они пристраиваются свойству "_" объекта parsedArgs.
Мой вопрос состоит в том, как правильно сделать интерфейс parseResult, чтобы intellisense корректно с ним работал и было видно какие свойства доступны, сейчас оно работает только со свойством "_".
Сейчас интерфейс выглядит вот так:
interface parseResults extends Record<string, string | string[]> {
_: string[];
}
Я бы забил и не стал с этим париться, но хочется, чтобы было удобнее пользоваться функцией. На английском стаке такой вопрос заминусили и только один ответ в комментариях, который совсем не помог. Возможно из-за моего отвратительного разговорного английского.