Typescript kombinera typer "keyof X" & SomeType


Jag vill definiera en typ som är nyckeln till någon annan typ. Det är möjligt att göra detta

interface B {
   x: something;
   y: string;
   z: something;
}

type keyOfB = keyof B;

export class A {
    foo: keyOfB;
}

Men samtidigt vill jag att foo bara ska vara en viss typ t.ex. sträng eller något, hur kombinerar man det?

foo: keyOfB & type 

funkar inte.

Teoretiskt sett är det ett jobb för Pick<> eller Extract<>, men jag kan inte få det att fungera

https://www.typescriptlang.org/docs/handbook/utility-types.html

Svar #1

Så jag modifierade svaret som publicerades här https://stackoverflow.com/a/53899815

till detta och det verkar fungera :)

type KeyOfType<T extends object, Type> = Exclude<{
    [K in keyof T]: T[K] extends Type
      ? K
      : never
  }[keyof T], undefined>

användning :

interface B {
   x: something;
   y: string;
   z: something;
}

export class A {
    foo: KeyOfType<B, string>;
}

Foo-egenskapen kommer endast att tillåtas att tilldela nyckeln i B som är av typen sträng. (endast 'y' i detta fall)