Skip to content

Instantly share code, notes, and snippets.

@klavinski
klavinski / linearTypes.ts
Last active August 31, 2025 10:38
One-time functions
class Linear {
use(this: unknown): asserts this is {use:never} {}
}
const linear: Linear = new Linear()
linear.use()
linear.use() // Second call is a type error
@klavinski
klavinski / dependentTypes.ts
Created July 9, 2025 18:55
Dependent types in TypeScript
interface Parser {
args: [ `${number}` ]
return: this[ "args" ] extends [ `${infer N extends number}` ] ? N : never
}
type DF<I extends { args: unknown[], return: unknown }> = ( <T extends I[ "args" ]>( ...args: T ) => ( I & { args: T } )[ "return" ] ) & { __type?: I }
type Apply<F extends ( ( ...args: any ) => any ), X extends Parameters<F>> = F extends { __type?: infer T extends { return: unknown } } ? ( T & { args: X } )[ "return" ] : ReturnType<F>
const parse: DF<Parser> = ( <T extends `${number}`>( str: T ) => parseFloat( str ) as T extends `${infer N extends number}` ? N : never as any )
@klavinski
klavinski / increments.ts
Created July 5, 2023 11:50
TypeScript arithmetic
type IncUnit = { 0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 0 }
type DecUnit = { 0: 9, 1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8 }
type Split<N extends number> = `${ N }` extends `${ infer A extends number }${ infer B extends number }` ? [ A, ...Split<B> ] : [ N ]
type Concat<T extends number[]> = T extends [ infer A extends number, ...infer B extends number[] ] ? `${ A }${ Concat<B> }` : ""
type AsNumber<T extends string> = T extends "-0" ? 0 : T extends `${ infer N extends number }` ? N : never
type IncrementASplitPositive<N extends number[]> = N extends [...infer Tens extends number[], infer Unit extends number] ? [ ...Unit extends 9 ? IncrementASplitPositive<Tens> : Tens, Unit extends keyof IncUnit ? IncUnit[ Unit ] : 0 ] : []
type DecrementASplitPositive<N extends number[]> = N extends [...infer Tens extends number[], infer Unit extends number] ? [ ...Unit extends 0 ? DecrementASplitPositive<Tens> : Tens, Unit extends keyof DecUnit ? DecUnit[ Unit ] : 0 ] : []