Skip to content

Instantly share code, notes, and snippets.

@tvler
tvler / shallowEqualWarnInDev.ts
Last active May 20, 2021 12:43
A custom React.memo memoization function that throws an error (in dev) if props change between renders.
/**
* A strict React.memo memoization function, built off
* the one that comes built-in, that throws an error
* (in dev) if props change between renders. Props you
* want to allow can be passed in as arguments.
*
* This "don't allow by default" model makes it so
* further changes to a component don't silently
* undo any memoization optimizations done before.
*
@tvler
tvler / inferTuple.ts
Created March 24, 2021 21:30
Infer an array argument as a tuple in typescript
// TS playground:
// https://www.typescriptlang.org/play?#code/PTAElByAoAzBXA7AxgFwJYHt6lfaBTAJwBVYAHAGzwB5JRQSK9Q8APZPeAEwGdRvkCOAOYBtALoAaUJAB8ACmRlKALlAiAdJoaUxASlABvWqAJ5FBLIsaQAvgG5IiTP2y5C2vETwuAvK-zESnhyIgDkAIahUqEARlGgoYihepCQwABUtOmgABKETOGmfOgAtkzc5KhCABbkAJ58qCWo5IWgcEhomFmgnHjQOKhd8LzI1eHI7eEtoMjo-oSg4bNBWcCpIKCAvBuA1XswCCgYWIQE6AQAjApBqhqa-ILwomJ6hsam5par9o7Okydn5y8vmYBFOFxCEXisShSRSaTAu32nSOILBACYqB55FYVPQgvojHR3rALCtrN8nCM-qCzmigZM-P8CGiIZFonForDdBsEXsOodMKizgBmTFBZhsDg8PgCYTibHXPGMAlvMwkz7khyUlxM4X00CMmkEYWsqEchJcoA
// ✅
function inferTuple<
Tuple extends string[],
>(tuple: [...Tuple]) {
return tuple
};
const inferTupleTest = inferTuple(['a', 'b', 'c'])
@tvler
tvler / WriteFragment.tsx
Created February 8, 2021 17:49
WriteFragment: A declarative way to write fragments to Apollo cache using React components
import { useApolloClient, Cache } from "@apollo/client";
import { useEffect } from "react";
/*
* WriteFragment: A declarative way to write fragments to Apollo cache
* using React components. When the fragment props change, the cache is
* updated. When then component unmounts, the fragment is deleted.
*
* This is essentially a reactive version of the cache.writeFragment
* method, using the same exact arguments and types.
@tvler
tvler / MockedApolloClient.ts
Created January 14, 2021 00:14
A mocked version of ApolloClient for Jest tests
import { ApolloCache, ApolloClient, ApolloLink, NormalizedCacheObject } from '@apollo/client';
class MockedApolloLink extends ApolloLink {
split = jest.fn();
concat = jest.fn();
request = jest.fn();
setOnError = jest.fn();
protected onError = jest.fn();
}
@tvler
tvler / IntersectionObserverBox.tsx
Last active December 21, 2020 23:24
A type-safe, polymorphic Box to wrap any forwardRef component with an Intersection Observer in React
import { useEffect, useRef } from "react";
/*
* A type-safe, polymorphic Box to wrap any forwardRef component
* with an Intersection Observer. Designed to be used in an
* unknown-length array map setting (infinite feed, etc.).
*
* The `callback` prop is closed over the passed-in `id` prop.
* This allows the `callback` prop to keep reference-equality
* between renders using something like `useCallback`, which
@tvler
tvler / ImplicityTypedActionPayloadByActionType.ts
Last active April 22, 2020 00:39
Implicitly type an action payload by an action type
type ActionTypes = 'actionA' | 'actionB' | 'actionC' | 'actionNoPayload';
type ActionPayloads = {
actionA: { payload: number };
actionB: { payload: string };
actionC: { foo: boolean; bar: boolean };
};
type Actions = {
[key in ActionTypes]: {
@tvler
tvler / useNewKey.jsx
Last active April 2, 2020 19:59
React hook that returns a new key when its passed in value goes from false to true
// React hook that returns a new key
// when its passed in value goes from false to true.
// Use this for resetting a child component, firing events, etc!
const useNewKey = bool => {
const [key, setKey] = useState(bool ? 0 : 1);
const newKey = Boolean(bool) === Boolean(key % 2) ? key + 1 : key;
useEffect(() => {
setKey(newKey);
@tvler
tvler / DeepRequiredNonNullable.ts
Last active January 22, 2020 19:52
Recursively remove all undefined and null types from data structures of arbitrary-depth
type DeepRequiredNonNullable<T> = T extends null | undefined
? never
: (T extends (infer ElementType)[]
? DeepRequiredNonNullable<ElementType>[]
: (T extends Record<string | number, any>
? { [key in keyof T]-?: DeepRequiredNonNullable<T[key]> }
: T));
// Number test
type BadPrimitive = number | null | undefined | string;
@tvler
tvler / areUnsortedArraysEqual.js
Last active April 18, 2019 15:58
A variadic function to see if any number of unsorted arrays all have the same values
const areUnsortedArraysEqual = (...arrs) => {
const everyEqual = ([first, ...arr], isEqual) =>
arr.every(item => isEqual(first, item));
return (
everyEqual(arrs, (first, arr) => arr.length === first.length) &&
everyEqual(
arrs.map(arr =>
arr.reduce(
(map, item) => map.set(item, (map.get(item) || 0) + 1),
@tvler
tvler / cartesianProduct.js
Created February 19, 2019 17:49
Get the cartesian product of multiple sets
// Thanks to eddmann.com/posts/cartesian-product-in-javascript
const cartesianProduct = (...sets) =>
sets.reduce((sets, set) => sets.flatMap(x => set.map(y => [...x, y])), [[]]);
cartesianProduct(
['a', 'b', 'c'],
['x', 'y', 'z'],
);