В основном мне нужно получить тип "Пара"
например
type Pair<T extends Record<string, string | number>, K extends keyof T> = {
field: K,
value: T[K]
}
так что дано
type Rabbit = {
name: string,
age: number,
weight: number
}
Я хотел бы иметь:
let namePair: Pair<Rabbit, keyof Rabbit> = {
field: 'name',
value: 123 //this should fail
}
Решение проблемы
Вы можете использовать общий тип T, который является ключом Rabbit.
type RabbitPair<T extends keyof Rabbit> = {
rabbitField: T
rabbitValue: Rabbit[T]
}
let field1: RabbitPair<"name"> = { rabbitField: 'name', rabbitValue: 'Johnny'}
let field2: RabbitPair<"age"> = { rabbitField: 'age', rabbitValue: 14}
let field3: RabbitPair<"weight"> = { rabbitField: 'weight', rabbitValue: 'This is not a number'}
function test<T extends keyof Rabbit>(t: RabbitPair<T>){}
test({
rabbitField: "age",
rabbitValue: 23 // fails if there is string here
})
Однако решение не работает идеально для массивов:
const arr: RabbitPair<keyof Rabbit>[] = []
arr.push({
rabbitField: "name",
rabbitValue: "value" // numbers work here too, but nothing else
})
function push_rabbit<T extends keyof Rabbit>(t: RabbitPair<T>){
arr.push(t)
}
push_rabbit({
rabbitField: "name",
rabbitValue: "value" // numbers don't work here
})
Комментариев нет:
Отправить комментарий