以这段代码为例:
const [divEl, spanEl] = createElements([
['div', { id: 'test' }, [
['a', { href: 'test' }, [
['img', { src: 'test' }, null]
]],
['img', { href: 'test' }, null]
]],
['span', null, null]
]);
我希望TypeScript能够推断出
divEl
的类型为HTMLDivElement
,并且推断出spanEl
的类型为HTMLSpanElement
。同时,我还希望它能够检查给定的属性,并根据推断的类型显示错误信息(例如,如果['img', { href: 'test' }, null]
中有href
属性,应该显示错误,因为HTMLImageElement
没有href
属性)。type ElementTag = keyof HTMLElementTagNameMap;
type ElementAttributes<T extends ElementTag> = {
[K in keyof HTMLElementTagNameMap[T]]?: Partial<HTMLElementTagNameMap[T][K]> | null;
};
type ElementArray<T extends ElementTag> = [
T,
ElementAttributes<T> | null,
ElementArray<ElementTag>[] | string | null
];
type MappedElementArray<T> = {
[K in keyof T]: T[K] extends ElementArray<infer L> ? HTMLElementTagNameMap[L] : never;
};
// This is the signature for the createElements function.
type CreateElements = <T extends ElementArray<ElementTag>[] | []>(
array: T
) => MappedElementArray<T>;
我必须将ElementArray<ElementTag>[]
更改为通用类型,但我不确定如何继续。
这是否可行?
我知道可以手动完成,但T1、T2、T3、T4、T5、T6、T7、T8、T9、T10......
并不美观。