Вы хотите инициализировать const allPaths
с помощью обобщенной функции c, чтобы 1) добавить ограничение типа PathDeclaration
и 2) let TS вывод данный объект буквальный тип автоматически. Только функции могут сделать это за один шаг.
const createPaths = <T extends PathDeclaration>(pd: T) => pd
const allPaths = createPaths({
'one': { prop1: 'foo' },
'two': { prop1: 'bar', prop2: 2 },
})
/*
{
one: { prop1: string; };
two: { prop1: string; prop2: number; };
}
*/
Выше будут ловить ошибки:
const allPathsError = createPaths({
'one': { prop3: 'foo' }, // error
'two': { prop1: 'bar', prop2: "bar" }, // error
})
И вывести все ключи:
// path: "one" | "two"
function getItem(path: Extract<keyof typeof allPathsInline, string>) {
return allPathsInline[path];
}
Это тоже один из немногих случаев, когда я хотел бы использовать IIFE , чтобы сделать вещи простыми:
const allPathsInline = (<T extends PathDeclaration>(pd: T) => pd)({
'one': { prop1: 'foo' },
'two': { prop1: 'bar', prop2: 2 },
})
Пример кода