#1367Medium

Remove Index Signature

Implement `RemoveIndexSignature<T>` , exclude the index signature from object types. Master advanced TypeScript type manipulation in this medium-level challenge on TypeScriptPro.

In this medium-level challenge, you'll implement RemoveIndexSignature<T> to exclude index signatures from object types, keeping only explicitly declared properties.

Challenge Instructions: Remove Index Signature

Medium

Implement RemoveIndexSignature<T> , exclude the index signature from object types.

For example:

type Foo = {
[key: string]: any
foo(): void
}
 
type A = RemoveIndexSignature<Foo> // expected { foo(): void }

Change the following code to make the test cases pass (no type check errors).

ChallengeSolution
type Foo = {
  [key: string]: any
  foo(): void
}

type Bar = {
  [key: number]: any
  bar(): void
  0: string
}

const foobar = Symbol('foobar')
type FooBar = {
  [key: symbol]: any
  [foobar](): void
}

type Baz = {
  bar(): void
  baz: string
}

type cases = [
  Expect<Equal<RemoveIndexSignature<Foo>, { foo(): void }>>,
  Expect<Equal<RemoveIndexSignature<Bar>, { bar(): void; 0: string }>>,
  Expect<Equal<RemoveIndexSignature<FooBar>, { [foobar](): void }>>,
  Expect<Equal<RemoveIndexSignature<Baz>, { bar(): void; baz: string }>>,
]

Pro Challenge

Unlock 102+ medium, hard, and extreme challenges to master advanced TypeScript.

One-time payment. Lifetime access.

Detailed Explanation

type RemoveIndexSignature<T> = {
  [K in keyof T as string extends K
    ? never
    : number extends K
      ? never
      : symbol extends K
        ? never
        : K]: T[K]
}

How it works:

This challenge helps you understand mapped type key remapping and how to distinguish between index signatures and explicitly declared properties in real-world scenarios.

This challenge is originally from here.

Share this challenge

Learn the Concepts