barnenoder - Typescript ChildNode: `parentElement` og/eller `parentNode` er null?


Så her er et filosofisk spørsmål.

I TypeScript kan en ChildNode være foreldreløs, siden både ChildNode.parentElement og ChildNode.parentNode har en null-type som alternativ.

Men å være ChildNode, ville det ikke, av sin egen natur, ha en forelder? Jeg kan forstå at parentElement kan være null, siden det kan stamme fra en ikke-elementnode (eller ville det til og med være mulig), men burde ikke i det minste parentNode være ikke-null?

Jeg forstår at det ikke er spesifikt angitt i DOM-spesifikasjonen, men ville det ikke være merkelig å ha en ChildNode uten forelder?

Er det slik i tilfelle du kanskje flytter noden bort fra forelderen? Men ville ikke noe slikt endre typen til ChildNode, til vanlig Node?

Jeg ville være veldig interessert i å få ditt innspill på dette spørsmålet, da det har gjort meg litt forvirret.

Svar #1

Fra https://developer.mozilla.org/en-US/docs/Web/API/ChildNode:

ChildNode-miksinen inneholder metoder og egenskaper som er vanlige for alle typer Node-objekter som kan ha en overordnet. Den er implementert av Element, DocumentType og CharacterData-objekter.

ChildNode betyr ikke «dette noden har for øyeblikket en overordnet node». Det er bare en mixin som andre typer implementerer for å inkludere metodene remove(), before(), after() og replaceWith().

Et eksempel på en type som arver fra Node, men ikke blander inn ChildNode-metodene, er Document. Et Document er en Node (dets barns parentNode ville være seg selv), men det kan aldri ha en overordnet node, så document.remove() gir en kompilasjonsfeil.

Er det slik i tilfelle du kanskje flytter noden bort fra forelderen? Men ville ikke noe slikt endre typen til ChildNode, til vanlig Node?

Dette er ikke hvordan TypeScripts statiske typetesting fungerer — å kalle en metode som remove() på et objekt endrer ikke typen. (Det kan teknisk sett være mulig i JavaScript å endre et objekts prototype, men TypeScript modellerer ikke dette.) Nodet er fortsatt et objekt av samme klasse som det var før fjerningen, så det implementerer fortsatt disse metodene, selv om det kanskje ikke gir mening å kalle dem når nodet ikke har noen forelder. Faktisk, siden hvert Element er en ChildNode, ville det ikke gi mening å dynamisk endre typen etter element.remove() fordi elementet fortsatt skal være et Element.

Relaterte artikler