Машинописный текст: заставить ключ и значение быть одного типа?

#typescript

Вопрос:

Я пытаюсь создать тип, выражающий следующее ограничение:

 // Valid
{
  "foo": "foo"
}

// Valid
{
  "bar": "bar"
}

// Not valid
{
  "foo": "bar"
}
 

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

 type KeyValueSameDict = {
  [key in string]: key
};
 

Однако это просто выводит тип Record<string, string> . Я также думаю, что мог бы сделать это, если бы знал ключи заранее:

 type KeyValueSameDictKeys = "foo" | "bar";

type KeyValueSameDict = {
  [v in KeyValueSameDictKeys]?: v;
};
 

Тем не менее, я хотел бы найти способ не делать этого.

Возможно ли то, что я пытаюсь сделать?

Ответ №1:

Ах, значит, мы можем сделать это, если разделим вывод на функцию идентификации:

 type KeyValueSameDict<Keys extends string> = {
  [v in Keys]?: v;
};

function inferGeneric<T extends string>(t: KeyValueSameDict<T>) {
  return t;
}

const foo = inferGeneric({ foo: 'foo', bar: 'bar' } as const);
 

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

1. Я думаю, что это лучше, чем мой ответ. Он работает для объектов с несколькими ключами

2. Создание пар ключ/значение не было обязательным в вопросе @Tomas Reimers.

3. @sno2 извиняюсь, если я не совсем ясно выразился — что вы имеете в виду, что это не могло быть необязательным?