TypeScript/tests/cases/compiler/intersectionsOfLargeUnions2.ts
2018-07-21 12:31:24 -07:00

38 lines
1,003 B
TypeScript

// @strict: true
// Repro from #24233
declare global {
interface ElementTagNameMap {
[index: number]: HTMLElement
}
interface HTMLElement {
[index: number]: HTMLElement;
}
}
export function assertIsElement(node: Node | null): node is Element {
let nodeType = node === null ? null : node.nodeType;
return nodeType === 1;
}
export function assertNodeTagName<
T extends keyof ElementTagNameMap,
U extends ElementTagNameMap[T]>(node: Node | null, tagName: T): node is U {
if (assertIsElement(node)) {
const nodeTagName = node.tagName.toLowerCase();
return nodeTagName === tagName;
}
return false;
}
export function assertNodeProperty<
T extends keyof ElementTagNameMap,
P extends keyof ElementTagNameMap[T],
V extends HTMLElementTagNameMap[T][P]>(node: Node | null, tagName: T, prop: P, value: V) {
if (assertNodeTagName(node, tagName)) {
node[prop];
}
}