Я очень новичок в Typescript, и у меня есть проблема, которую я не знаю, как ее решить :(.
В основном я хочу создать список кортежей из списка компонентов. Первый элемент кортежа — это имя элемента (ключ MyComponents), а вторые элементы — его атрибуты.
(см. код ниже)
interface MyComponents {
Container: {
fluid?: boolean
className?: string
},
Tag: {
text?: string
className?: string
hidden: boolean
}
}
//Get the keys of the list of my components
type Element = keyof MyComponents
//Get the attributes depending on the element name
type PickAttributes<T extends Element> = Pick<MyComponents[T], keyof MyComponents[T]>
//Create a mapped tuple type [Element, Attributes]
// and the attributes depend on the element
export type Tuple = {
[Element in keyof MyComponents] : [Element, PickAttributes<Element>]
}[keyof MyComponents]
const attr : PickAttributes<'Tag'> = {hidden : false} //This works and the auto completion works perfectly
const tuple1 : Tuple = ["Tag", { hidden: false}] //This also works
const tuple2 : Tuple = ["Container", { hidden: false}] //Error but it's normal as the element 'Container' doesn't have the property hidden:boolean
Все работает отлично, но есть небольшая проблема с автодополнением. Когда я набираю первый элемент (Контейнер, Тег,...), автодополнение второго элемента (его атрибутов) показывает все возможные атрибуты, даже неправильные.
Например, если я набираю «Тег» для первого элемента, он предлагает мне «жидкий», но «жидкий» доступен только в «Контейнере»! Intellisense показывает все варианты
И когда я выбираю жидкость, она также знает, что она несовместима...
Typescript знает, что он несовместим
Итак, мой вопрос: Как я могу ограничить автозаполнение, чтобы отображались только действительные атрибуты в зависимости от имени элемента?
Любая помощь будет оценена! Спасибо !**
keyof MyComponents
эквивалентен фактическому строковому значению, потому что ключи объектаMyComponents
сами являются строками.keyof MyComponents === "Tag" | "Container"
- person jered   schedule 24.04.2021