如何将Javascript文件导入Typescript

时间:2016-02-02 08:44:03

标签: javascript twitter-bootstrap typescript angular

我想知道如何从Typescript启动Twitter-Bootstrap。

$('.carousel').carousel()

我必须实现 jquery.d.ts 来修复$ -sign调用,但是我仍然遇到 .carousel()无法解决的错误可以在jquery.d.ts找到。

我尝试将javascript捆绑到一个模块并像这样调用它。但它似乎没有用。 这是我的代码:

carousel.d.ts

declare module 'carousel/carousel' {
    var start: any; 
    export = start;
}

carousel.js

System.register('carousel/carousel', [], true, function () {
    var carousel = function () {
        function carousel() {
        }
        carousel.prototype.start = function () {
            $('.carousel').carousel();
        }
    }
    exports.carousel = carousel;
});

app.ts

import {Component} from "angular2/core";
import {bootstrap} from 'angular2/platform/browser';
import {Carousel} from "carousel/carousel";

@Component({
    selector: "carousel",
    bindings: [CarouselComponent],
    templateUrl: 'carousel.html'
})

export class CarouselComponent {
    start() {
            carousel.start();
        }        
    }
}

bootstrap(CarouselComponent)

感谢您提供帮助。

6 个答案:

答案 0 :(得分:3)

问题是您没有carousel()的输入定义。就像你提到的那样 - 它是Twitter-Bootstrap中的一个函数,但是你只为jQuery包含了输入定义(*。d.ts)。您需要以相同的方式将它们包含在Bootstrap中。

您可以从他们的GitHubNuGet package获取DefinitelyTyped项目中的完整Bootstrap绑定定义。以下是必要部分:

interface CarouselOptions {
    interval?: number;
    pause?: string;
    wrap?: boolean;
    keybord?: boolean;
}

interface JQuery {
    carousel(options?: CarouselOptions): JQuery;
    carousel(command: string): JQuery;
}

答案 1 :(得分:1)

我会像这样重构你的carousel.js文件:

System.register("carousel/carousel", [], true, function(require, exports, module) {
  var carousel = function () {
    function carousel() {
    }
    carousel.prototype.start = function () {
        $('.carousel').carousel();
    }
  }
  exports.carousel = carousel;
});

答案 2 :(得分:1)

创建一个文件“jquery-caroussel.d.ts”(并将其添加到您的reference.ts) 在里面:

interface JQuery {
   carousel();
}

它会对ts编译器说,而不是有一个将在稍后实施的方法旋转木马()。 (在浏览器中,由carousel.js文件。)

如果你有另一个lib而不是轮播的问题,那么这里有大量的界面样本:https://github.com/DefinitelyTyped/DefinitelyTyped

答案 3 :(得分:0)

您可以通过为每个所需的库声明一个环境模块来导入JS文件。您可以拥有一个ambient.d.ts文件,用于存储所有环境模块声明(即,您要导入的JavaScript库,但您没有类型定义)

ambient.d.ts:

// You would have a separate module declaration for each JavaScript library
// you want to import for which you do not have any type definitions
declare module 'my-module-i-want-to-import' {
  const a : any;
  export default a;
}

需要my-module-i-want-to-import的任何其他* .ts文件:

// Include reference to your ambient module declarations
///<reference path="./ambient.d.ts" />
import myModule from 'my-module-i-want-to-import';

// Do something with myModule
console.log(myModule);

答案 4 :(得分:0)

最后,我改变了我的代码以使用“InjectionToken”。 如下所述:Use jQuery in Angular/Typescript without a type definition

您可以简单地注入jQuery全局实例并使用它。为此,您不需要任何类型定义或类型。

import { InjectionToken } from '@angular/core';

export const JQ_TOKEN = new InjectionToken('jQuery');

export function jQueryFactory() {
    return window['jQuery'];
}

export const JQUERY_PROVIDER = [
    { provide: JQ_TOKEN, useFactory: jQueryFactory },
];

在app.module.ts中正确设置:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { JQ_TOKEN } from './jQuery.service';

declare let jQuery: Object;

@NgModule({
    imports: [
        BrowserModule
    ],
    declarations: [
        AppComponent
    ],
    providers: [
        { provide: JQ_TOKEN, useValue: jQuery }
    ],
    bootstrap: [AppComponent]
})
export class AppModule { }

您可以在组件中开始使用它:

import { Component, Inject } from '@angular/core';
import { JQ_TOKEN } from './jQuery.service';

@Component({
    selector: "selector",
    templateUrl: 'somefile.html'
})
export class SomeComponent {
    constructor( @Inject(JQ_TOKEN) private $: any) { }

    somefunction() {
        this.$('...').doSomething();
    }
}

答案 5 :(得分:-1)

在Angular的最终版本之后,(对于jquery.js和bootstrap.js)

1)添加以下 npm包

  npm install --save-dev @types/jquery
  npm install --save-dev @types/bootstrap
tsconfig.json 中的

2)类型数组中添加以下条目,

  "types": [
             "jquery",
             "bootstrap",  
           ]

现在你现在好了。

<强> Jquery carousel method error in Angular2/typescript