generateIdentifierType
typescript
generateIdentifierType: (
column: TableColumn,
details: TableDetails,
config: InstantiatedConfig,
) => TypeDeclaration;
This function is called for table columns that are marked as primary keys. It can be used to create specific types for such properties.
The default implementation creates a branded type which is a Typescript trick for creating nominal types. With these, you can be certain that you don't accidentally end up assigning a MemberId
to an AccountId
, even if those are both represented as integers in the database.
It looks like this:
ts
export const defaultGenerateIdentifierType: GenerateIdentifierType = (
column,
details,
config,
) => {
const name = escapeIdentifier(
toPascalCase(details.name) + toPascalCase(column.name),
);
const innerType = resolveType(column, details, {
...config,
// Explicitly disable identifier resolution so we get the actual inner type here
generateIdentifierType: undefined,
});
const imports = [];
let type = innerType;
if (typeof innerType === "object") {
// Handle non-primitives
type = innerType.name;
imports.push(...innerType.typeImports);
}
return {
declarationType: "typeDeclaration",
name,
exportAs: "named",
typeDefinition: [`${type} & { __brand: '${escapeString(name)}' }`],
typeImports: imports,
comment: [`Identifier type for ${details.schemaName}.${details.name}`],
};
};