Невозможно импортировать переменную из скомпилированной библиотеки в Javascript Typescript

Это мой файл package.json

{
  "name": "deep-playground-prototype",
  "version": "2016.3.10",
  "description": "",
  "private": true,
  "scripts": {
    "clean": "rimraf dist",
    "start": "npm run serve-watch",

    "prep": "browserify src/csv.ts -p [tsify] | uglifyjs -c > csv.js && copyfiles analytics.js dist && concat node_modules/material-design-lite/material.min.js node_modules/seedrandom/seedrandom.min.js csv.js > dist/lib.js",
    "build-css": "copyfiles fonts.css dist && concat node_modules/material-design-lite/material.min.css styles.css > dist/bundle.css",
    "watch-css": "concat node_modules/material-design-lite/material.min.css styles.css -o dist/bundle.css",
    "build-html": "copyfiles index.html dist",
    "watch-html": "concat index.html -o dist/index.html",
    "watch-js": "watchify src/playground.ts -p [tsify] -v --debug -o dist/bundle.js",
    "build-js": "browserify src/playground.ts -p [tsify] | uglifyjs -c > dist/bundle.js",
    "build": "npm run prep && npm run build-js && npm run build-css && npm run build-html",
    "watch": "npm run prep && concurrently \"npm run watch-js\" \"npm run watch-css\" \"npm run watch-html\"",
    "serve": "http-server -o -c-1 dist/",
    "serve-watch": "concurrently \"http-server -o -c-1 dist/\" \"npm run watch\""
  },
  "devDependencies": {
    "@types/d3": "^3.5.41",
    "concat": "^1.0.3",
    "concurrently": "3.1.0",
    "copyfiles": "1.0.0",
    "http-server": "^0.11.1",
    "rimraf": "2.5.4",
    "tsify": "^4.0.0",
    "typescript": "^2.9",
    "uglify-js": "^2.8.29",
    "watchify": "^3.11.0"
  },
  "dependencies": {
    "@types/jquery": "^3.3.27",
    "csv-parse": "^4.2.0",
    "csvtojson": "^2.0.8",
    "d3": "^3.5.16",
    "https-proxy-agent": "^2.2.1",
    "material-design-lite": "^1.3.0",
    "seedrandom": "^2.4.3",
    "typings": "^2.1.1"
  }
}

Файл csv.ts:

import {csv} from 'd3';
async function delay(ms: number) {
    return new Promise( resolve => setTimeout(resolve, ms) );
}
export let train = [];
(async()=>{console.info('before delay');csv("training.csv",function(error,data){train = data});await delay(1000);console.info('after delay')})();

Сначала я пытаюсь загрузить данные в переменную с именем train. Затем пытаюсь вставить его из файла lib.js в программу:

import {train} from 'lib';

Но после компиляции появляется следующая ошибка:

TypeScript error: src/dataset.ts(17,21): Error TS2307: Cannot find module 'lib'.

Я что-то упустил в этом процессе.

Убедитесь, что ваш файл lib существует, и вы импортируете его в свой основной файл HTML.

Harsh Chaurasia 18.12.2018 12:43

Он существует во время компиляции, когда создается. Вы можете увидеть это в моем файле package.json. Дайте мне знать, если у вас возникнут другие вопросы. Пожалуйста, дайте мне знать, что я могу сделать.

Jaffer Wilson 18.12.2018 12:53

куда вы импортируете файл lib.js

Harsh Chaurasia 18.12.2018 12:54

Вы видите это в моем вопросе: import {train} from 'lib';

Jaffer Wilson 18.12.2018 12:58

Я понял, что lib.js - это недавно созданный файл. Это не модуль. Следовательно, вы не можете импортировать модули из файла js таким образом.

Harsh Chaurasia 18.12.2018 13:04

Попробуйте импортировать {train} из csv; как это определено в csv

Harsh Chaurasia 18.12.2018 13:06

Так что вы хоть представляете, что я могу сделать в этом случае, потому что я не понимаю, что я могу сделать, чтобы сначала загрузить csv, а затем следует остальная часть моей программы.

Jaffer Wilson 18.12.2018 13:07

Я пробовал это. Но он вернет пустой массив.

Jaffer Wilson 18.12.2018 13:08

Позвольте нам продолжить обсуждение в чате.

Jaffer Wilson 18.12.2018 13:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
9
174
1

Ответы 1

Если вы не измените логику загрузки модуля, вам, вероятно, понадобится относительный путь импорта:

import { train } from './lib'; // Assuming same folder, otherwise adjust path

'lib' работает, если это распознанный модуль, например зависимость, установленная на node_modules.

Получение следующей ошибки: Error TS2307: Cannot find module './lib'.

Jaffer Wilson 18.12.2018 13:26

У вас есть скомпилированный файл декларации типа (lib.d.ts)?

H.B. 18.12.2018 13:34

Нет, у меня этого не было. Я уже упоминал, что он создается посредством определения пакета. Как вы можете видеть, это в моем package.json, о котором я упоминал в вопросе.

Jaffer Wilson 18.12.2018 13:58

Я не знаком с опцией browserify, но она должна быть каким-то образом настраиваемой, чтобы вы могли вывести ее. Это будет необходимо, если вы хотите использовать модуль в TS.

H.B. 18.12.2018 14:01

хорошо, так что мне нужно делать в lib.d.ts? Мне нужно писать только ссылки? Если да, то как я могу это упомянуть, дайте мне знать.

Jaffer Wilson 18.12.2018 14:18

Он должен описывать API модуля, который может быть автоматически сгенерирован компилятором TypeScript, вы должны писать их вручную только для кода, который всегда был JS. Для получения дополнительной информации прочтите документация.

H.B. 18.12.2018 15:27

Флаг tsc для генерации объявлений - --declaration. Как заставить это работать с вашим конвейером - решать вам.

H.B. 18.12.2018 15:29

Другие вопросы по теме