#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 извиняюсь, если я не совсем ясно выразился — что вы имеете в виду, что это не могло быть необязательным?