Record & Tuple
Lightweight, typed implementation of the Records and Tuples proposal, only supports standard library. See @bloomberg/record-tuple-polyfill
for experimental syntax support with a Babel transform.
Installation
npm install record-tuple
Basic Usage
import { Tuple, Record } from "record-tuple";
JSON.stringify(Tuple(1, 2, 3));
JSON.stringify(Record({ a: "a", b: "b" }));
Tuple(1, 2, 3) === Tuple(1, 2, 3);
Record({ a: "a", b: "b" }) === Record({ a: "a", b: "b" });
Record({ a: "a", b: "b" }) === Record({ b: "b", a: "a" });
JSON.stringify(Record({ b: "b", a: "a" }));
const map = new Map();
map.set(Tuple(1, 2, 3), "value 1");
map.set(Record({ a: "a" }), "value 2");
map.get(Tuple(1, 2, 3));
map.get(Record({ a: "a" }));
const tuple: Tuple.Type<[number, number]> = Tuple(1, 2);
const tuple: Tuple.Type<[number, number]> = [1, 2];
const tuple: Tuple.Type<[number, number]> = Tuple(1, 2, 3);
const record: Record.Type<{ a: string }> = Record({ a: "a" });
const record: Record.Type<{ a: string }> = { a: "a" };
const record: Record.Type<{ a: string }> = Record({ b: "b" });
Why Tuple/Record.Type?
We want to avoid overriding Typescript's first-party Record
type. We use Tuple.Type
for consistency, but will continue to provide a Tuple<...>
alias for convenience.
RecordTuple
RecordTuple
allows for generic immutable data structure creation.
RecordTuple.deep
does the same, but deeply.
import { RecordTuple, Tuple, Record } from "record-tuple";
RecordTuple([1, 2, 3]) === Tuple(1, 2, 3);
RecordTuple({ a: "a", b: "b" }) === Record({ a: "a", b: "b" });
RecordTuple.deep([
{ a: "a", b: "b" },
{ c: "c", d: "d" },
]) === Tuple(Record({ a: "a", b: "b" }), Record({ c: "c", d: "d" }));