ค้นหาเว็บไซต์

Typescript - การนำเข้า vs "ประกาศตัวแปร" พร้อมการกำหนดประเภท


การสร้างแอป Angular 2 โดยใช้ Typescript ฉันกำลังพยายามนำเข้าห้องสมุดที่เป็นที่นิยม d3

ฉันได้ติดตั้งการกำหนดประเภทโดยใช้ TSD และฉันกำลังอ้างอิงไฟล์ tsd.d.ts อย่างถูกต้อง:

/// <reference path="../../../tools/typings/tsd/tsd.d.ts" />

ตอนนี้ ฉันต้องการ import โมดูลโหนด d3 ของฉัน ซึ่งติดตั้งผ่าน NPM:

/// <reference path="../../../tools/typings/tsd/tsd.d.ts" />
import * as d3 from 'd3/d3';

นี่ใช้ได้ แต่ฉันไม่ได้รับประโยชน์ใด ๆ จากการนิยามชนิดของฉัน IDE ของฉันไม่ได้ให้ข้อมูลอัตโนมัติเกี่ยวกับชนิดหรือการเน้นไวยากรณ์ ถ้าฉันเปลี่ยนเป็นแบบนี้:

/// <reference path="../../../tools/typings/tsd/tsd.d.ts" />
import * as d3 from 'd3/d3';

ตอนนี้ฉันได้รับไฮไลต์ไวยากรณ์และคำจำกัดความเติมข้อความอัตโนมัติต่าง ๆ ที่ฉันคาดไว้แล้ว อย่างไรก็ตาม แอปของฉันกำลังมองหาไฟล์ที่ node_modules/d3.js ซึ่งไม่มีอยู่ ดังนั้นสิ่งนี้จึงแน่นอนว่าใช้งานไม่ได้

เมื่อฉันเปลี่ยนคำสั่งนำเข้าเป็นการประกาศ var แอปของฉันก็คอมไพล์ได้อย่างถูกต้องและฉันได้รับคำนิยาม typescript ทั้งหมดที่เหมาะสม:

/// <reference path="../../../tools/typings/tsd/tsd.d.ts" />
declare var d3 = require('d3/d3');

ดังนั้น คำถามของผมคือ แนวทางที่ถูกต้องคืออะไร? ความแตกต่างระหว่าง import กับ declare var คืออะไร และมีวิธีใดบ้างในการรับคำจำกัดความประเภทเมื่อใช้ import หากไม่ได้รวมอยู่ในโมดูล npm เอง?

ฉันสังเกตว่าบางสิ่งเช่น import {Component} from 'angular2/core'; ทำงานได้ดี แต่การกำหนดประเภทจะรวมอยู่ในไดเรกทอรีเดียวกันกับไฟล์จาวาสคริปต์ที่ฉันกำลังนำเข้า

คำตอบ #1

import * as d3 from 'd3/d3'; ควรทำงานได้ดีในระบบประเภท (โดยไม่ต้องใช้ ///<reference .../>) ตราบใดที่ตัวเลือกคอมไพเลอร์ถูกต้อง และโครงสร้างโฟลเดอร์ในโฟลเดอร์ typings ถูกต้อง

declare var d3 คือวิธีการประกาศตัวแปรที่มีอยู่ที่ใดที่หนึ่งใน JS คิดมันเหมือนกับว่า "ใช่ๆ ไทป์สคริปต์ เลิกบ่นได้แล้ว เชื่อฉัน มันมีอยู่จริง"

import {Component} from 'angular/core'; คือวิธีการดึงส่วนเฉพาะจากโมดูล ในคำศัพท์ของ Node จะเทียบได้กับ var Component=require('angular/core').Component;

ตัวเลือกคอมไพเลอร์ที่สำคัญที่ต้องเปิดคือ "moduleResolution": "node" ซึ่งควรเปิดอยู่แล้วเพื่อให้ Angular ทำงานได้

ดังนั้นถ้า d3 ถูกติดตั้งเป็น node_module คุณก็สามารถใช้งานได้อย่างง่ายดายโดย:

npm install d3
npm install --save-dev @types/d3
tsc

แล้ว

import * as d3 from 'd3';

บทความที่เกี่ยวข้อง