TypeScript 的 React 支持

JSX 语法

JSX 是 React 库引入的一种语法,可以在 JavaScript 脚本中直接书写 HTML 风格的标签。

TypeScript 支持 JSX 语法,但是必须将脚本后缀名改成.tsx

.tsx文件中,类型断言一律使用as形式,因为尖括号的写法会与 JSX 冲突。

  1. // 使用
  2. var x = foo as any;
  3. // 不使用
  4. var x = <any>foo;

上面示例中,变量foo被断言为类型any,在.tsx文件中只能使用第一种写法,不使用第二种写法。

React 库

TypeScript 使用 React 库必须引入 React 的类型定义。

  1. /// <reference path="react.d.ts" />
  2. interface Props {
  3. name: string;
  4. }
  5. class MyComponent extends React.Component<Props, {}> {
  6. render() {
  7. return <span>{this.props.name}</span>;
  8. }
  9. }
  10. <MyComponent name="bar" />; // OK
  11. <MyComponent name={0} />; // error, `name` is not a number

内置元素

内置元素使用JSX.IntrinsicElements接口。默认情况下,内置元素不进行类型检查。但是,如果给出了接口定义,就会进行类型检查。

  1. declare namespace JSX {
  2. interface IntrinsicElements {
  3. foo: any;
  4. }
  5. }
  6. <foo />; // ok
  7. <bar />; // error

上面示例中,<bar />不符合接口定义,所以报错。

一种解决办法就是,在接口中定义一个通用元素。

  1. declare namespace JSX {
  2. interface IntrinsicElements {
  3. [elemName: string]: any;
  4. }
  5. }

上面示例中, 元素名可以是任意字符串。

组件的写法

  1. interface FooProp {
  2. name: string;
  3. X: number;
  4. Y: number;
  5. }
  6. declare function AnotherComponent(prop: { name: string });
  7. function ComponentFoo(prop: FooProp) {
  8. return <AnotherComponent name={prop.name} />;
  9. }
  10. const Button = (prop: { value: string }, context: { color: string }) => (
  11. <button />
  12. );