Возможен ли общий ключ записи?

#typescript

#typescript

Вопрос:

Можно ли вернуть запись с общим ключом? Ввод текста позволяет это, но реализация кажется невозможной.

 function foo<K extends string>(key: K): Record<K, string> {
    return {
        [key]: "foo"
    }
}
  

Ошибка:

Type '{ [x: string]: string; }' is not assignable to type 'Record<K, string>'.(2322)

Ответ №1:

Быстрое решение состоит в том, чтобы утверждать, что ваш возвращаемый объект имеет правильный тип.

 function foo<K extends string>(key: K): Record<K, string> {
    return {
        [key]: "foo"
    } as Record<K, string>
}
  

Причина, по которой это необходимо, заключается в том, что typescript признает возможность того, что тип K может быть шире, чем просто строка литерала key ( K может быть string или объединение строковых литералов). Если это так, то ваш возвращаемый объект фактически не будет соответствовать возвращаемому типу, потому что он не будет иметь значения для каждого ключа K .

В настоящее время невозможно указать, что общий ключ должен быть одной буквальной строкой, поэтому требуется некоторая доработка as .

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

1. Интересно спуститься в эту конкретную кроличью нору, например, так . Это то, что они рассмотрели, упомянули здесь (как Unionize тип), но я думаю, что это нигде не было сделано.