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ć.