Skip to content

Instantly share code, notes, and snippets.

@roman-balzer
Created August 1, 2024 20:10
Show Gist options
  • Save roman-balzer/05761e121cdb4ec2a9195dddaf7dac42 to your computer and use it in GitHub Desktop.
Save roman-balzer/05761e121cdb4ec2a9195dddaf7dac42 to your computer and use it in GitHub Desktop.
PrimeNG Table - Typing for Templates
/* Credit goes to Alain Boudard, only thanks to his article I understood how that works
* Link: https://coco-boudard.medium.com/typing-angular-primeng-table-templates-columns-e7859df76f9b
*/
import { Directive, input } from '@angular/core'
import { TableTemplates } from 'primeng/table'
type PTableTemplate<T extends keyof TableTemplates> = Parameters<TableTemplates[T]>[0]
type TableRowTemplateContext<TItem extends object, TName extends keyof TableTemplates> = {
$implicit: TItem
} & Omit<PTableTemplate<TName>, '$implicit'>
@Directive({
standalone: true,
// eslint-disable-next-line @angular-eslint/directive-selector
selector: 'ng-template[primeTableRowTypeGuard]',
})
export class PrimeTableRowTypeGuardDirective<TItem extends object, TName extends keyof TableTemplates> {
items = input.required<TItem[]>({ alias: 'primeTableRowTypeGuard' })
templateName = input.required<TName>({ alias: 'pTemplate' })
static ngTemplateContextGuard<TContextItem extends object, TContextName extends keyof TableTemplates>(
dir: PrimeTableRowTypeGuardDirective<TContextItem, TContextName>,
ctx: unknown,
): ctx is TableRowTemplateContext<TContextItem, TContextName> {
return true
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment