Optymalizacja toLowerCase w typescript

Podczas analizy wydajności aplikacji przy pomocy flamegraph zauważyłem częste wywoływania toLowerCase.
Jak zoptymalizować toLowerCase ? Nie wywoływać go kiedy na stringu zostało już wykonane toLowerCase.

Dlatego też powstał mały helper pomagający w ustaleniu gdzie wywołanie toLowerCase jest nadmiarowe wykorzystując Omit oraz branded types

// Step 1: Define the Branded Type
type LowercaseString = string & { __brand: "LowercaseString" };

// Step 2: Type Guard Function
function toLowercaseString(s: string): LowercaseString {
    return s.toLowerCase() as LowercaseString;
}

// Step 3: Override Type Definitions
type RemoveToLowerCase<T> = Omit<T, "toLowerCase">;

type SafeLowercaseString = RemoveToLowerCase<LowercaseString>;

// Usage
const normalizedInput: SafeLowercaseString = toLowercaseString("Hello World");

// Trying to call toLowerCase() on normalizedInput will result in a TypeScript error
// normalizedInput.toLowerCase(); // Error: Property 'toLowerCase' does not exist on type 'string & { __brand: "LowercaseString"; }'.

// To use it as a normal string, you need to explicitly cast it back
const normalString: string = normalizedInput as string;
normalString.toLowerCase(); // This is fine, but now it's not type-checked as a lowercase string

/*------------------------------------------------------------------------------------------------------------*/

// Step 1: Define the Branded Type
type SafeLowercaseString = Omit<string, "toLowerCase"> & { __brand: "LowercaseString" };

// Step 2: Type Guard Function
function toLowercaseString(s: string): SafeLowercaseString {
    return s.toLowerCase() as unknown as SafeLowercaseString;
}

// Usage
const normalizedInput = toLowercaseString("Hello World");

// Trying to call toLowerCase() on normalizedInput will result in a TypeScript error
// normalizedInput.toLowerCase(); // Error: Property 'toLowerCase' does not exist on type 'string & { __brand: "LowercaseString"; }'.

// To use it as a normal string, you need to explicitly cast it back
const normalString: string = normalizedInput as string;
normalString.toLowerCase(); // This is fine, but now it's not type-checked as a lowercase string

Gist na githubie https://gist.github.com/DarkGL/3c8f70a194447d64fad4c3941c8a03cc

Dostosowanie do toLocaleLowerCase jest dość proste jak widać.

Dodaj komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.