2016-10-21 19 views
7

Được rồi, câu hỏi đầu tiên của tôi về SO, thật thú vị! :)Định nghĩa kiểu MomentJS với Typescript 2.0

Tôi đang cố gắng để có được định nghĩa MomentJS để làm việc với Typescript 2.0.

Tôi không có vấn đề gì trong việc đưa định nghĩa về góc hoạt động, chỉ cần thực hiện bằng cách thực hiện npm install @types/angular --save-dev.

Tuy nhiên, MomentJS (2.15.1) đã đi kèm với moment.d.ts như một phần của gói bạn nhận được khi bạn cài đặt.

Nếu bạn cố gắng làm một cách tiếp cận tương tự như góc, tức là npm install @types/moment --save-dev, đây là những gì bạn nhận được:

NPM WARN phản @ loại/khoảnh khắc @ 2.13.0: Đây là một định nghĩa kiểu stub cho Moment (https://github.com/moment/moment). Moment cung cấp các định nghĩa kiểu của riêng nó, vì vậy bạn không cần phải cài đặt @ types/moment!

Và chắc chắn đủ, nếu bạn truy cập node_modules\@types\moment, không có gì hữu ích trong đó.

Có, tôi đã thêm tệp tsconfig.json vào thư mục gốc của mình, vì vậy Typescript 2.0 sẽ tự động nhận @types trên node_modules (đây là lý do tại sao Angular hoạt động tốt), nhưng đối với MomentJS tôi nhận được lỗi bên dưới (kể từ. d.ts không nằm ở vị trí TS2 mong đợi nó):

TS2304 Không thể tìm thấy tên 'thời điểm'.

Tôi cũng đã thử chơi với cấu hình "typeRoots" trên tsconfig.json mà không có bất kỳ may mắn nào.

Đây là mảnh liên quan của package.json tôi:

{ 
    "devDependencies": { 
    "@types/angular": "^1.5.16" 
    }, 
    "dependencies": { 
     "moment": "^2.15.1" 
    } 
} 

Tôi đang sử dụng VS2015, nếu những vấn đề này.

Vì vậy, ... Bất kỳ ý tưởng nào về cách lấy Typecript 2.0 để đọc định nghĩa kiểu cho Moment, nằm trên thư mục "không mong muốn"?

+2

Tôi có cùng một vấn đề, bạn đã tìm thấy một giải pháp? – Joshua

+2

Tôi cũng có vấn đề này – mosesfetters

+2

Có cùng một vấn đề, cho thời điểm này tôi không thể tìm thấy một sửa chữa – Jochen

Trả lời

3

tôi tìm thấy ở một nơi khác (nhưng không nhớ ở đâu), mà bạn nên

moment.d.ts thay đổi bằng cách thay thế tuyên bố xuất khẩu với

declare module 'moment' { 
    export default moment; 
} 

thêm fixmoment.ts tập tin giả để bạn dự án với dòng sau

import * as moment from 'moment'; 

Biên dịch với tsc trực tiếp bây giờ biên dịch tất cả các tệp. Rất tiếc, VS2015 vẫn đưa ra lỗi tsc: lỗi TS2688: Xây dựng: Không thể tìm thấy tệp định nghĩa loại cho 'thời điểm'. mà tôi không hiểu.

+0

Đây là tài liệu tham khảo: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/11864 OP của chuỗi _seems_ để có thể giải quyết bằng cách KHÔNG thêm hack. Tuy nhiên, không có bước nào được đề cập trong chuỗi làm việc cho tôi. Cách giải quyết vẫn là trạng thái @rekna. – user1821052

+0

quá trình nhập * như thời điểm ... không hoạt động đối với tôi nhưng tham chiếu như sau: /// hlo

1

Tôi gặp vấn đề tương tự. Tôi đọc số này comment và thêm declare var moment; vào custom-typings.d.ts. sau đó nó hoạt động tốt, nhưng tôi không hiểu tại sao.

VS2015 SP3 + TypeScript2.0.6.0, dự án dựa trên angular2-webpack-starter.

4

Bạn sẽ tìm thấy tệp moment.d.ts dưới node_modules\moment vì tệp được đóng gói với chính khoảnh khắc đó.

Với VS 2017 và TypeScript 2.2, bạn không phải chỉ định typeRoots; Tuy nhiên, môi trường của bạn có thể yêu cầu xác định hai hoặc nhiều trong số họ như:

typeRoots: [ 'node_modules/@types/', 'node_modules/moment/' ]

^tôi quên nếu mỗi @types thư mục con cần một mục trong typeRoots.

Đây là quá trình tôi sử dụng trong VS 2017nguyên cảo 2.2 mà không cần bất kỳ sự thay đổi đặc biệt để tsconfig.json (nhưng công cụ này thay đổi trong các phiên bản gần đây):

Nó được tự động tìm thấy qua ES6 phong cách nhập khẩu:

import * as moment from "moment";

này sẽ nhập khẩu các chức năng đặt tên moment cũng như không gian tên moment sáp nhập vào một bí danh duy nhất.

Nếu bạn cũng muốn (kiểu trả về) Moment nhập khẩu, thực hiện như sau cũng như:

import { Moment } from "moment";

Trong hiện tại moment.d.ts (2.18.1), loại này là khác không thể tiếp cận.

Trong quá khứ tôi đã sử dụng var moment = require("moment"); nhưng điều đó có thể không thực hiện được trong thiết lập của bạn, trừ khi bạn đang chạy browserify hoặc requirejs để chuyển đổi CommonJS/AMD kiểu đòi hỏi một cái gì đó trình duyệt hỗ trợ.

0

Làm như sau trong một file customer-typings.d.ts làm việc cho tôi

///<reference path="node_modules/moment/moment.d.ts"/> 
import moment = Moment; 
declare const moment: Moment; 

Tôi thậm chí không cần phải thực hiện bất kỳ thay đổi ts tsconfig.json tập tin

Các vấn đề liên quan