#Extract "known" types

11 messages · Page 1 of 1 (latest)

fervent mountain
#

Given a type like this:

type X = {
  a: string;
  b: number;
  [prop: string]: any;
};

Is there a way to filter out the "catch-all" prop property and extract just the "known" types so you get something like this:

type Known<T> = /* Magic goes here... */
type K = Known<X>; // Equals { a: string; b: number; }

I know I can do this by explicitly extracting the types:

type K = {a:X['a'], b:X['b'] }

But I need a general purpose option...

upper blade
#

how it can be done, is left as an exercise for the reader

pearl patrolBOT
upper blade
#

!ts

pearl patrolBOT
#
type X = {
  a: string;
  b: number;
  [prop: string]: any;
};

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

type What = WithoutIndexSignatures<X>;
//   ^? - type What = {
//       a: string;
//       b: number;
//   }
type What2 = WithoutIndexSignatures<{
//   ^? - type What2 = {
//       a: string;
//       b: number;
//   }
  a: string;
  b: number;
  [prop: string | number]: any;
}>;
type What3 = WithoutIndexSignatures<{
//   ^? - type What3 = {
//       a: string;
//       b: number;
//   }
  a: string;
  b: number;
  [prop: PropertyKey]: any;
}>;```
fervent mountain
#

@upper blade Thanks! Overall that makes sense (remove all keys that are not "concrete" types), but what is the "as" doing there? Sorry but I've never seen type assertions in a type definition before.

upper blade
#

!hb key remapping

pearl patrolBOT
upper blade
#

@fervent mountain ^

fervent mountain
#

@upper blade Great. Thanks again!