Вам нужно использовать сопоставленные типы для достижения этого, но также Exclude
не будет работать с типом string
, оно будет работать только с типом объединения, а строка не является объединением. Результат Exclude<string, 'anything'>
будет просто string
ниже доказательства.
type StillOnlyString = Exclude<string, 'anything'>
Чтобы добиться исключения, нам нужно предоставить переменную типа, которая будет объединением ключей, которые мы будем иметь в объекте. Рассмотрим:
type WithCategory<Keys extends string> = {category : string} & {
[K in Exclude<Keys,'category'>]: number
}
const x: WithCategory<'other'> = {
category: 'str',
other: 1
}
Возможно, он немного многословен, но мы гарантируем, что поле category
всегда будет строковым, а любое другое будет number
.