#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
тип), но я думаю, что это нигде не было сделано.