node.js (используя ts-node) ссылается на локальный модуль TypeScript, вызывая TypeError для конструктора - PullRequest
0 голосов
/ 06 сентября 2018

Я создаю проект ReactJS и TypeScript и хочу использовать модуль, которым я поделюсь между моим веб-приложением и сервером API.

Для своего веб-приложения я использовал приложение create-реагировать с ts-scripts. Я сделал свой общий модуль без использования начального проекта, потому что он довольно прост.

Мое веб-приложение ссылается на мой общий модуль с помощью функции локальных пакетов NPM, команда npm install --save <path/to/shared/package>

Когда я делаю npm run start для своего приложения реагирования, я получаю ошибку

TypeError: __WEBPACK_IMPORTED_MODULE_3_validation_shared__.ValidEmail is not a constructor

validation_shared - это мое невообразимое имя модуля.

TypeScript, вызывающий ошибку:

const valid_email = new ValidEmail("john.doe@example.com");

Могу ли я что-нибудь изменить в своих настройках или настройках, чтобы это работало? Я хотел бы использовать typcript & ts-node и иметь общие модули.

Редактировать - добавить код для ValidEmail и других функций в этом файле.

export function validate(email_address: string): boolean {
    return email_address.indexOf("@") !== -1;
}

export class ValidEmail {

    public email_address: string;

    constructor(email_address: string) {
        if(validate(email_address)) {
            this.email_address = email_address;
        } else {
            throw new TypeError("Invalid value for email address param, it must contains an @ symbol.");
        }
    }
}

После дополнительных исследований выясняется, что процесс создания-реакции-приложения, который использует webpack / bundling, связывает определения импорта с внешним кодом, но не добавляет фактические определения классов и функций.

Я выяснил это, проверив сгенерированный код, который загружен в Chrome, и нашел фактическое имя класса «ValidEmail», которого нет.

Редактировать # 2 - вывод console.log Я обновил свой App.tsx до этого

import { HeaderBar, IHeaderBarProps } from "./components/headerbar";

import * as vs from "validate-shared";

class App extends React.Component {
  public render() {

    console.log(vs);

И результат console.log (vs): /static/media/index.9d88054a.ts

Когда я смотрю на содержимое файла, я вижу только

export * from "./ValidEmail";
export * from "./User";

Это имеет смысл, потому что это содержимое моего файла index.ts для этого модуля. Я нигде не могу найти "мясо" файлов ValidEmail или User. Похоже, что реальный код для этих классов нигде не включен.

...