Hinter den Kulissen stellt TypeScript eine Reihe von Hooks bereit, mit denen TSX auf konsistent erweiterbare Weise typisiert werden kann. Dies sind besondere Typen im global.JSX-Namensraum, die TypeScript in Ihrem Programm als »Quelle der Wahrheit« für TSX-Typen ansieht.
Wenn Sie nur mit React arbeiten, brauchen Sie diese Hooks nicht zu kennen. Sobald Sie aber eine TypeScript-Bibliothek schreiben, die TSX ohne React verwendet, finden Sie in diesem Anhang hilfreiche Hinweise darüber, welche Hooks Sie benutzen können. |
TSX unterstützt zwei Arten von Elementen: einbaute (intrinsiche Elemente) und benutzerdefinierte (wertbasierte Elemente). Intrinsische Elemente werden grundsätzlich in Kleinbuchstaben benannt und beziehen sich auf eingebaute Elemente wie <li>, <h1> und <div>. Die Namen von wertbasierten Elementen werden in PascalCase angegeben. Sie beziehen sich auf Elemente, die Sie mit React (oder einem anderen Framework, das Sie mit TSX verwenden) erstellen. Sie können entweder als Funktionen oder als Klassen definiert werden. Siehe Abbildung G-1.
Abbildung G-1: Die Arten der TSX-Elemente
Wir benutzen als Beispiel die Typdeklarationen von React (http://bit.ly/2CNzeW2), um Ihnen die von TypeScript verwendeten Hooks vorzustellen, die TypeScript einsetzt, um TSX sicher zu typisieren. Hier sehen Sie, wie React sich in TSX einklinkt, um JSX sicher zu typisieren:
declare global {
namespace JSX {
interface Element extends React.ReactElement<any> {}
interface ElementClass extends React.Component<any> {
render(): React.ReactNode
}
interface ElementAttributesProperty {
props: {}
}
interface ElementChildrenAttribute {
children: {}
}
type LibraryManagedAttributes<C, P> = // ...
interface IntrinsicAttributes extends React.Attributes {}
interface IntrinsicClassAttributes<T> extends React.ClassAttributes<T> {}
interface IntrinsicElements {
a: React.DetailedHTMLProps<
React.AnchorHTMLAttributes<HTMLAnchorElement>,
HTMLAnchorElement
>
abbr: React.DetailedHTMLProps<
React.HTMLAttributes<HTMLElement>,
HTMLElement
>
address: React.DetailedHTMLProps<
React.HTMLAttributes<HTMLElement>,
HTMLElement
>
// ...
}
}
}
Durch die Deklaration dieser Typen im globalen JSX-Namensraum können Sie TypeScripts Typechecker-Verhalten für TSX anzapfen und es nach Belieben anpassen. Solange Sie keine Bibliothek schreiben, die TSX (aber nicht React) verwendet, werden Sie diese Hooks vermutlich nie anfassen.