[英]How to get Literal instead of Union type in TypeScript
我創建了一個用於創建動態元素的函數。 但不是返回元素的文字類型,而是返回<HTMLElementTagNameMap>
的並集。
function createElement(type: keyof HTMLElementTagNameMap) {
return document.createElement(type)
}
如果我們只使用上面的函數,它會返回以下的聯合:
(HTMLElement | HTMLObjectElement | HTMLAnchorElement | HTMLAreaElement | HTMLAudioElement | ... 57 more ... | HTMLVideoElement).
到目前為止我嘗試了什么:
type valueOf<T> = T[keyof T]
function createElement<T extends valueOf<HTMLElementTagNameMap>>(type: keyof HTMLElementTagNameMap) {
return document.createElement(type) as T
}
PS - 我也很困惑? 上述功能是如何工作的?
而是以如下所述的方式使用上述功能:
const div = createElement<HTMLDivElement>('div')
我希望它像我們使用時一樣自動推斷類型的type
:
let li = document.createElement('li')
該代碼有效,因為您通過泛型類型T
手動傳遞返回類型。
您可以通過以下代碼將其自動化:
const createElement = <K extends keyof HTMLElementTagNameMap>(name: K): HTMLElementTagNameMap[K]{
return document.createElement(name)
}
const div = createElement('div')
console.log(div)
// [LOG]: HTMLDivElement: {}
它和你寫的沒有什么不同。 我希望它有所幫助。 如果您有任何問題,歡迎在評論中提問
如果您想要與document.createElement
相同的行為,您可以簡單地編寫
function createElement<K extends keyof HTMLElementTagNameMap>(type: K) {
return document.createElement(type);
}
或者如果你想通過 HTML 元素選擇標簽名稱,你可以使用這樣的東西
type PickTagNameForHTMLElement<TargetElement> = {
[K in keyof HTMLElementTagNameMap]: HTMLElementTagNameMap[K] extends TargetElement ? K : never;
}[keyof HTMLElementTagNameMap];
function createElement<TargetElement extends HTMLElement>(type: PickTagNameForHTMLElement<TargetElement>) {
return document.createElement(type);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.