Ссылка на ключ дважды в типе

#typescript

Вопрос:

Приношу извинения за плохое название, мне трудно выразить эту концепцию.

У меня есть такой типаж:

 type Foo = {
  a: number,
  b: string,
  c: boolean,
}
 

Я хочу повторно использовать этот тип следующим образом:

 type FooInfo = {
  property: keyof Foo,
  description: string,
  value: Foo[this.property]
}
 

Идея этого типа заключается в том, что если property установлено значение a , то тип value должен быть Foo[a] (таким образом, «число»).

Допустимый пример использования этого типа:

 const propA = {
  property: 'a',
  description: 'This is a',
  value: 5
}
 

Я также пытался играть с дженериками, но я хочу, чтобы тип value был выведен.

Есть ли способ сделать это с помощью машинописного текста?

Ответ №1:

Я думаю, что здесь стоит использовать объединения в сочетании с сопоставленными типами:

 type Foo = {
  a: number,
  b: string,
  c: boolean,
}
type Values<T>=T[keyof T]

type FooToFooInfo = {
    [Prop in keyof Foo]:{
        property:Prop;
        description:string;
        value:Foo[Prop] // <--- same purpose as Foo[this.property]
    }
}

type Result = Values<FooToFooInfo>
 

Игровая площадка

Комментарии:

1. Спасибо! хотя это не точный ответ, на самом деле он немного ближе к тому, что я искал.

2. Вы также можете создать вспомогательную функцию и вывести опору значения. Вас интересует такое решение?

3. Я на самом деле хорошо разбираюсь в этом ответе и реализовал его вариант, спасибо! Смотрите здесь: github.com/curveball/a12n-server/pull/332

4. Конечно, никаких проблем