2015-10-20 6 views
6

Ich überprüfe auf Eingangstyp irgendeines Elements, zB Checkbox in TS. Jetzt bin ich mir sicher, dass ich das Element checkbox habe, also sollte dieses Element die Eigenschaft checked haben. Aber wenn ich einfach tunTypescript, wie man dieses Element erkennt, ist checkbox, also element.checked ist nicht rot unterstrichen

als es funktioniert, aber element.checked ist rot unterstrichen. Ich denke, dass ich einfach von HTMLElement zu etwas wie CheckboxElement wiederholen muss, aber nichts passendes für diese Umwandlung fand. Wie man das los wird? Ich habe dies auch im Falle von element.value

Antwort

4

Es gibt keine "Checkbox" Elementtyp, da es nur ein "Eingabe" -Element mit dem Typ checkbox ist. Sie könnten nutzen/behaupten mit dem Typ HTMLInputElement die eine Erweiterung von HTMLElement ist:

var element: HTMLInputElement; 
//... You still need to do all the null checks as necessary 
//The below check may be irrelevant depending upon what you are actually doing. 
//But i am just adding here to show that you need to refer to the property "type" and 
//not "InputType" 
if (element.type.toLowerCase() == "checkbox") { 
    element.checked = true; 
} 
+1

+1 und nur aus Gründen der Klarheit, er muss nicht den Test oben tun, wenn mit 'HTMLInputElement' ... jetzt kann er einfach nutzen die' checked 'property:' (wenn element.checked') {... ' –

+0

@SunilD. Thx, OP kann es entfernen, vielleicht ist es ein Teil des Codes, der den Standard basierend auf dem Eingabetyp des Elements setzt, und das Kontrollkästchen ist zufällig einer davon. Nur um Ihre Aussage zu verdeutlichen: "Er muss den obigen Test nicht durchführen, wenn er HTMLInputElement verwendet". Die Geltendmachung eines bestimmten Typs mit Typoskript stellt keine Runtime-Sicherheit sicher, obwohl die spezifische Überprüfung hier irrelevant ist und Sie Recht haben. – PSL

+0

Danke für die Hilfe. Eine Sache noch. Angenommen, ich habe einen Listener bei Änderungsereignissen, jetzt möchte ich den Typ der Eingabe überprüfen: ' event.target) .type) == "password" 'jetzt sicher, dass dies in' event.target) .type geändert werden kann. == "password" 'aber das Problem ist, dass Änderungsereignis auf Element gefeuert werden kann, die ich nicht genau weiß, was es ist, aber ich nehme an, dass es Eigenschaft' type' nicht hat. Gibt es einen sicheren Weg, Casting in TS zu verwenden? Nur die Dinge, die mir in den Sinn kommen, ist, dass ich vorher prüfen werde, ob dieses Tag eingegeben wird. @Sunil D. –

4

Die if Anweisung nicht erforderlich ist, wie andere bereits erwähnt. Allerdings gibt es mehrere Möglichkeiten, wie Compiler glücklich zu machen:

// 1st (best variant in my opinion) 
let e1: HTMLInputElement; // type of variable 
e1.checked = true; 

// 2nd (sometimes a good option too)  
let e2 = document.getElementById('myInput'); 
(<HTMLInputElement>e2).checked = true; // "hint" the type to TypeScript 

// 3rd (a hack that may come handy sometimes) 
let e3 = document.getElementById('myInput'); 
e2['checked'] = true; 
+0

'explizite Umwandlung '-> Typescript hat keine Typumwandlung wie in anderen Sprachen, es ist Typ Assertion imho, auch basierend auf Ihrem Code zur Laufzeit, wenn es das Element nicht finden kann nächste Zeile wird die Fehlertyp Assertion werfen wird nicht gespeichert. – PSL

+0

Sie haben Recht. Es ist nur ein "Hinweis", der den TypeScript-Compiler glücklich macht. Ich habe Mühe, in der Spezifikation etwas darüber zu finden. –

Verwandte Themen