首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打字稿能输入Webpack UMD吗?

打字稿能输入Webpack UMD吗?
EN

Stack Overflow用户
提问于 2016-03-02 04:56:54
回答 2查看 4.3K关注 0票数 6

使用TypeScript,有什么方法可以用webpack UMD (通用模块定义)包装的import模块吗?例如:

代码语言:javascript
复制
npm install knockback

.js文件(node_modules/knockback/knockback.js)的开头如下:

代码语言:javascript
复制
(function webpackUniversalModuleDefinition(root, factory) {
    if(typeof exports === 'object' && typeof module === 'object')
        module.exports = factory(require("knockout"), require("backbone"), ....
    else if(typeof define === 'function' && define.amd)
        define(["knockout", "backbone", "underscore"], function webpackLoadOptionalExternalModuleAmd( ....
        });
    else if(typeof exports === 'object')
        exports["kb"] = factory(require("knockout"), require("backbone"), require("underscore"), (function ....
    else
        root["kb"] = factory(root["ko"], root["Backbone"], root["_"], root["jQuery"]);

当我试图将它导入到.ts文件中时,tsc会产生一个错误:

代码语言:javascript
复制
import * as k from 'knockback/knockback';

TS2307: Build: Cannot find module 'knockback/knockback'.

除了编辑knockback.js文件之外,我还能做些什么来说服tsc导入这个.js吗?我用的是打字本1.8。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-02 05:39:42

当我试图将它导入到.ts文件中时,tsc会产生一个错误:

您可以很容易地使用类型定义文件。

文件knockback.d.ts

代码语言:javascript
复制
declare module 'knockback/knockback' {
    var foo: any;
    export = foo;
}
票数 4
EN

Stack Overflow用户

发布于 2016-03-02 16:22:04

FYI,对于其他试图通过类型记录使用knockback.js的人来说,DefinitelyTyped提供了一个预先存在的knockback.d.ts文件。但是,现有的.d.ts不包括export,因此不能用于外部模块。基于basarat的回答,我对.d.ts文件进行了如下修改:

1)在末尾加上以下内容:

代码语言:javascript
复制
declare module "knockback" {
    export = Knockback;
}

2)将declare var kb: Knockback.Static从末端移除。

3)删除interface Static extends Utils {包装器,并将Static接口中的所有内容移动到命名空间范围。示例:

旧:

代码语言:javascript
复制
interface Static extends Utils {
    ViewModel;
    CollectionObservable;
    collectionObservable(model?: Backbone.Collection<Backbone.Model>, options?: CollectionOptions): CollectionObservable;
    observable(
        /** the model to observe (can be null) */
        model: Backbone.Model,
        /** the create options. String is a single attribute name, Array is an array of attribute names. */
        options: IObservableOptions,
        /** the viewModel */
        vm?: ViewModel): KnockoutObservable<any>;
    ...
}

新的:

代码语言:javascript
复制
    function collectionObservable(model?: Backbone.Collection<Backbone.Model>, options?: CollectionOptions): CollectionObservable;
    function observable(
        /** the model to observe (can be null) */
        model: Backbone.Model,
        /** the create options. String is a single attribute name, Array is an array of attribute names. */
        options: IObservableOptions,
        /** the viewModel */
        vm?: ViewModel): KnockoutObservable<any>;
    ...

在这些更改之后,用法如下所示:

代码语言:javascript
复制
import * as kb from 'knockback';

class MyViewModel extends kb.ViewModel {
    public name: KnockoutObservable<string>;

    constructor(model: Backbone.Model) {
        super();

        this.name = kb.observable(model, "name");
    }
}

var model = new Backbone.Model({ name: "Hello World" });
var viewModel = new MyViewModel(model);

kb.applyBindings(viewModel, $("#kb_observable")[0]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35738820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档