I have a db-config file in the following form:
const simpleDbConfig: DbConfig = {
firstTable: {
columns: {
foo: { nameDb: "Foo", dataType: "TEXT" },
bar: { nameDb: "Bar", dataType: "TEXT" },
},
},
};
And also the following type definitions:
interface DbConfig {
firstTable: DbTable<"foo" | "bar">;
}
interface DbTable<T extends string> {
columns: ColumnObject<T>;
}
type ColumnObject<T extends string> = Record<T, Column>;
interface Column {
nameDb: string;
dataType: string;
}
Now what I am trying to do is write a function, that gets the key of a table and an array of keys of columns of this table as well as a property of those columns. It should return an object mapping the column keys to the value of the passed in property of those columns.
Here's the function:
Version 1:
function getColKeyToPropMap<
TDbTblJsName extends keyof DbConfig,
TDbTblColObjRecord extends DbConfig[TDbTblJsName]["columns"],
TDColJsName extends keyof TDbTblColObjRecord,
TDbColObj extends TDbTblColObjRecord[TDColJsName],
TColPropName extends keyof TDbColObj
>(tbl: TDbTblJsName, cols: TDColJsName[], colPropName: TColPropName) {
const tblInfo: TDbTblColObjRecord = simpleDbConfig[tbl].columns as TDbTblColObjRecord;
const resObj: Record<TDColJsName, TDbColObj[TColPropName]> = {} as Record<TDColJsName, TDbColObj[TColPropName]>;
for (let col of cols) {
resObj[col] = tblInfo[col][colPropName];
}
return resObj;
}
Version 2:
function getColKeyToPropMap<
TDbTblJsName extends keyof DbConfig,
TDbTblColObjRecord extends DbConfig[TDbTblJsName]["columns"],
TDbColObj extends TDbTblColObjRecord[keyof TDbTblColObjRecord]
>(tbl: TDbTblJsName, cols: Array<keyof TDbTblColObjRecord>, colPropName: keyof TDbColObj) {
const tblInfo: TDbTblColObjRecord = simpleDbConfig[tbl].columns as TDbTblColObjRecord;
const resObj: Record<keyof TDbTblColObjRecord, TDbColObj[keyof TDbColObj]> = {} as Record<keyof TDbTblColObjRecord, TDbColObj[keyof TDbColObj]>;
for (let col of cols) {
resObj[col] = tblInfo[col][colPropName];
}
return resObj;
}
Here is an exemplary function call:
const test = getColKeyToPropMap("firstTable", ["foo"], "nameDb");
// test should be
// {foo : Foo}
I get the following typescript error regarding this line within the for loop: "resObj[col] = tblInfo[col][colPropName];":
"Type 'TColPropName' cannot be used to index type 'TDbTblColObjRecord[TDbColJsName]'."
Where is my mistake?
Thanks for your time and help!
I tried to access nested types with indexed access. Despite the access being valid in javascript, it somehow is not in typescript.