Как правильно импортировать React JSX из отдельного файла в Typescript 1.6

У меня есть следующий файл app.tsx, который отлично работает, загружая элемент App из React.Component и дочерний элемент Worklist из другого React.Component (оба класса определены в одном файле app.tsx). Это работает в Visual Studio с установленным Typescript 1.6 (версия ECMAScript: ECMAScript 5, компиляция JSX: React, модульная система: CommonJS).

Однако я хотел бы разделить эти два компонента на отдельные файлы. Однако, когда я раскомментирую импорт WorkList и удаляю определение класса для компонента WorkList из app.tsx - происходит сбой с ошибкой:

Ошибка TS2604 Тип элемента JSX "WorkList" не имеет никаких конструкций или сигнатур вызовов.

Вот рабочий app.tsx и желаемый worklist.tsx.

// app.tsx
import * as React from "react";
import * as ReactDOM  from "react-dom";
//import * as WorkList from "./worklist";

interface Props {
    foo: string;
}

class WorkList extends React.Component<Props, {}> {
    constructor(props: Props) {
        super(props);
    }
    render() {
        return <h2>WorkList!{this.props.foo} </h2>
    }
}
class App extends React.Component<Props, {}> {
    constructor(props: Props) {
        super(props);
    }
    public render() {
        return <WorkList foo="baz"></WorkList>
    }
}


ReactDOM.render(    
    React.createElement(App, { foo: 'bar' }),
    document.getElementById('app')
);




//worklist.tsx
import * as React from "react";

interface Props {
    foo: string;
}

class WorkList extends React.Component<Props, {}> {
    constructor(props: Props) {
        super(props);
    }
    render() {
        return <h2>WorkList!{this.props.foo} </h2>
    }
}

<WorkList foo="bar" />

Как правильно импортировать дочерний JSX с помощью Typescript 1.6?

Вот рабочий код с правильным ответом:

// app.tsx
import * as React from "react";
import * as ReactDOM  from "react-dom";
import WorkList from "./worklist";

interface Props {
    foo: string;
}

class App extends React.Component<Props, {}> {
    constructor(props: Props) {
        super(props);
    }
    public render() {
        return <WorkList foo="baz"></WorkList>
    }
}       
ReactDOM.render(

    React.createElement(App, { foo: 'bar' }),
    document.getElementById('app')
);

//worklist.tsx
import * as React from "react";

interface Props {
    foo: string;
}

export default class WorkList extends React.Component<Props, {}> {
    constructor(props: Props) {
        super(props);
    }
    render() {
        return <h2>WorkList!{this.props.foo} </h2>
    }
}

person bleslie404    schedule 31.10.2015    source источник


Ответы (1)


Я ожидаю, что вам нужно правильно экспортировать класс WorkList в файл worklist.tsx, например. как экспорт по умолчанию:

export default class WorkList extend React.Component<Props, {}>

а затем импортируйте его в app.tsx:

import WorkList from "worklist"

Это должно решить вашу проблему.

person FlorianTopf    schedule 01.11.2015
comment
Идеально! Это сработало! Я пробовал так много комбинаций, похожих на ваш, но не эту точную. Спасибо!! - person bleslie404; 01.11.2015