Remove the key starting with `_` from given type `T`. Master advanced TypeScript type manipulation in this medium-level challenge on TypeScriptPro.
In this medium-level challenge, you'll implement a PublicType utility that removes all properties whose keys start with an underscore _, exposing only the "public" members of an object type.
Remove the key starting with _ from given type T.
Change the following code to make the test cases pass (no type check errors).
type cases = [
Expect<Equal<PublicType<{ a: number }>, { a: number }>>,
Expect<Equal<PublicType<{ _b: string | bigint }>, {}>>,
Expect<Equal<PublicType<{ readonly c?: number }>, { readonly c?: number }>>,
Expect<Equal<PublicType<{ d: string; _e: string }>, { d: string }>>,
Expect<Equal<PublicType<{ _f: () => bigint[] }>, {}>>,
Expect<Equal<PublicType<{ g: '_g' }>, { g: '_g' }>>,
Expect<Equal<PublicType<{ __h: number; i: unknown }>, { i: unknown }>>,
]
Unlock 102+ medium, hard, and extreme challenges to master advanced TypeScript.
One-time payment. Lifetime access.
type PublicType<T extends object> = {
[K in keyof T as K extends `_${string}` ? never : K]: T[K]
}How it works:
K in T.as clause performs key remapping using a template literal pattern: K extends `_${string}` checks if the key starts with an underscore._, it is remapped to never, effectively removing it from the resulting type.readonly, and optionality._ (like { g: '_g' }) is kept, since the filter applies to the key name, not the value.This challenge helps you understand template literal types combined with key remapping, and how to apply this pattern for convention-based type filtering in real-world scenarios.
This challenge is originally from here.