This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 ) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 ] : [] |