Skip to content

Instantly share code, notes, and snippets.

@disco0
Forked from joaomilho/log.ts
Last active December 21, 2020 11:52
Show Gist options
  • Save disco0/1fa8dbd98d0d18edd44ccc23c5578b75 to your computer and use it in GitHub Desktop.
Save disco0/1fa8dbd98d0d18edd44ccc23c5578b75 to your computer and use it in GitHub Desktop.
A printf with dependant types in TypeScript, similar to Idris (https://gist.github.com/chrisdone/672efcd784528b7d0b7e17ad9c115292)
///<reference lib="dom"/>
//#region Implementation
type FieldType<Field> =
's' extends Field ? string :
'f' extends Field ? number :
'i' extends Field ? number :
'd' extends Field ? number :
'o' extends Field ? HTMLElement :
'O' extends Field ? object :
'c' extends Field ? string : never;
type ExtractFields<T> =
T extends `${infer _}%${infer Field}${infer R}`
? [FieldType<Field>, ...ExtractFields<R>] :
T extends `${infer _}%${infer Field}`
? [FieldType<Field>] :
[ ];
//#endregion Implementation
//#region Integration
interface Console
{
// All the methods process format specifiers, iirc
log<Fmt extends string>(fmt: Fmt, ...args: ExtractFields<Fmt>): void;
info<Fmt extends string>(fmt: Fmt, ...args: ExtractFields<Fmt>): void;
debug<Fmt extends string>(fmt: Fmt, ...args: ExtractFields<Fmt>): void;
warn<Fmt extends string>(fmt: Fmt, ...args: ExtractFields<Fmt>): void;
error<Fmt extends string>(fmt: Fmt, ...args: ExtractFields<Fmt>): void;
trace<Fmt extends string>(fmt: Fmt, ...args: ExtractFields<Fmt>): void;
group<Fmt extends string>(fmt: Fmt, ...args: ExtractFields<Fmt>): void;
groupCollapsed<Fmt extends string>(fmt: Fmt, ...args: ExtractFields<Fmt>): void;
}
//#endregion Integration
console.log("Stuff: %s %f %O", 'Hello', 123, { ok: true });
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment