GOOGLE ADS

среда, 27 апреля 2022 г.

Создайте объект таким образом, чтобы одно поле было типом значения, соответствующим другому ключевому полю.

В основном мне нужно получить тип "Пара"

например

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
})

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

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...