4 ms·
You can approximate something by defining the valid TokenTable keys as an enum, and using a mapped type for the actual TokenTable type. There's some boilerplat
by gnud 4y ago
You can approximate something by defining the valid TokenTable keys as an enum, and using a mapped type for the actual TokenTable type.
There's some boilerplate in the definition, but it's fairly clean and non-repetitive. And easy to use in the "client code".
https://www.typescriptlang.org/play?#code/KYOwrgtgBAKg9ga1ASQCJQN4Cgq6gBwBswBnKAXigHIjSqAaHPCAS3DMqtfYadwCMAhiADmFakNG88BQQCdQAeXyhxNeUpUgqWAL5YALgE8VsRKBiD+hYAB4YAPnHYZAbQRQ2ZpCDQBdAC5YPSwAelCoAGFBAGMAC2AoADM4OSgDBPSTRJEweQATLBi4EBIDKAB9eB80DlxFfgArYBiDADokIxIACmqUVABKLCSwEFaWEs8SPt987s6gsrk2EQGoIM6p737MPigFAzA5EEqZ2ra2GOJ84B7Oof1wqG7jFXy1whYyqDgkqEFCIQoAA3AEsfLpcwnZD5EhFErfACCgLOsPEVSh5ySLEIBmAcm6X1RQywWBs5XwggMeOOZCCM0s1jsACVgCIAKIAD3wTkoLjwtBIQVCAB0ANShRgybikYUigC0kr2khEcoAhEqZJSFCBlKA5d1QiEycBygYoeIAESWgDcJvK4PpmPQAB8oKMbtiQMB8nb7VASGB+EsVla1ZbSU8AKokRIZRKfb6-KCdOEpNLdYqlcqbZPIwiokhrfm4LPfCBU+LiSnU-GldzAIx+NrATktbqB4MGZaiAY2qB7FhJboVgzxYt7GRluA2NqEOAieaNoYyfT6MIRRRyeieP5GOBgKgKKAgODlQPHgFA1P-Y-4BSxkAGHekRKCKC5ArDVLPMs5xueCcNY0qUE4yEOhLTJicz3GBMh4H+UCjlWlDAXWJANk2LZtjEHZBiGvb9pOeAQchcRwfB8HTrO86LvcxG4Poq56EAA https://www.typescriptlang.org/play?#code/KYOwrgtgBAKg9ga1AS...
- shadowofneptune 4y agoYou put some real effort into the example. It's the opposite approach of how I did it, yet works just as well. Thanks!
- cuddlecake 4y agoYou can also write the array first, without using enum: const tokens = ['parenOpen', 'bang', 'plus', 'minus'] as const; type Token = typeof tokens[number]; type TokenTable<T> = Record<Token, T> // alias for { [key in Token]: T } const isToken = (t: string): t is Token => tokens.includes(t); const patterns: TokenTable<RegExp> = { bang: /\+/, // rest }