Skip to content

Instantly share code, notes, and snippets.

View rauschma's full-sized avatar

Axel Rauschmayer rauschma

View GitHub Profile
@rauschma
rauschma / create-enum.ts
Last active March 25, 2025 12:50
createEnum(): helper for creating enum objects
// More information on enum objects as an alternative to enums:
// https://2ality.com/2025/01/typescript-enum-patterns.html#alternative-to-enum%3A-object-literal-1
/**
* Returns an enum object. Adds the following improvements:
* - Sets the prototype to `null`.
* - Freezes the object.
* - The result has the same type as if `as const` had been applied.
*/
function createEnum<

Book on JavaScript

  • If you see a JavaScript feature in this book that you don’t understand, you can look it up in my book “Exploring JavaScript” which is free to read online. Some of the “Further reading” sections at the ends of chapters refer to this book.

Books on TypeScript

// Experiment: I’m not sure if I would use this myself.
const call = Symbol('call');
class Callable {
constructor() {
// Can’t use .bind() here. Not sure why. Maybe the result doesn’t
// interact well with Object.setPrototypeOf().
const _this = (...args) => new.target.prototype[call].call(_this, ...args);
Object.setPrototypeOf(_this, new.target.prototype);
return _this;
@rauschma
rauschma / partial-application.ts
Last active January 29, 2025 13:07
Typing partial application in TypeScript
//========== Testing types ==========
const expectType = <Type>(_: Type): void => void 0;
type TypeEqual<Target, Value> = (<T>() => T extends Target
? 1
: 2) extends <T>() => T extends Value ? 1 : 2
? true
: false;
//========== applyPartial ==========
// Q: Why not an object literal?
// A: Then you have to create separate constants for the symbols:
// https://2ality.com/2025/01/typescript-enum-patterns.html#using-symbols-as-property-values
type PropertyValues<Obj> = Obj[keyof Obj];
function createEnum<C extends new (...args: unknown[]) => unknown>(enumClass: C): Omit<C, 'prototype'> {
return enumClass;
}
const Color = createEnum(class {
type CreateTuple<Len extends number, Acc extends unknown[] = []> =
Acc['length'] extends Len
? Acc
: CreateTuple<Len, [...Acc, true]>;
;
type Length<Tup extends Array<unknown>> =
Tup['length']
;
type Unshift<Tuple extends Array<unknown>, Value> =
@rauschma
rauschma / assert-type.ts
Last active February 1, 2025 12:16
assert-type: API for asserting types
// This code is now an npm package: https://github.com/rauschma/asserttt
// Slightly modified version of: https://github.com/es-shims/RegExp.escape/blob/main/test/tests.js
import test from 'node:test';
import assert from 'node:assert/strict';
import {regExpEscape as escape} from './regexp-escape.mjs';
const forEach = (arrayLike, callback) => Array.prototype.forEach.call(arrayLike, callback);
const inspect = String;
test('strings', function (st) {

Mastodon for people who are new to social media

In this blog post, I try to explain Mastodon to people who are not familiar with social media and/or beginner computer users. I try to be as jargon-free as I can.

Structure of this blog post:

  • Reading section 1 and 2 takes a bit of effort: They explain important background knowledge for Mastodon. But, in my opinion, the effort is worth it because you’ll find it much easier to use Mastodon. Not having this knowledge can prevent even otherwise advanced computer users from enjoying Mastodon.

  • Section 3 is brief and mentions first steps for actually getting started with Mastodon.