【问题标题】:Cannot find Dojo dijit/form/xxx inside of TypeScript class在 TypeScript 类中找不到 Dojo dijit/form/xxx
【发布时间】:2015-05-11 19:20:44
【问题描述】:

我的问题

我非常成功地创建了导入 Dojo 类的 TypeScript 类,例如 array、lang、Deferred、on、dom-construct 等等。第一次,我试图拉一些 dijit 的东西。具体来说,dijit/form/Horizo​​ntalSlider 和 dijit/form/VerticalSlider。但是,当我编译时,我不断得到:

error TS2304: Cannot find name 'HorizontalSlider'

我的代码

我有一个项目范围的 tsd.d.ts,如下所示:

/// <reference path="./dojo/dijit.d.ts" />
/// <reference path="./dojo/dojo.d.ts" />

我正在使用 Mayhem 的 dts,因为它们比绝对类型 (https://github.com/SitePen/mayhem/tree/master/typings/dojo) 的打字要好。下面是 Horizo​​ntalSlider 的定义:

declare module 'dijit/form/HorizontalSlider' {
    import _FormValueWidget = require('dijit/form/_FormValueWidget');
    interface HorizontalSlider extends _FormValueWidget {
    }
    export = HorizontalSlider;
}

编辑:根据 Ryan Cavanaugh 的回复澄清该语法,这里是来自相同 dts 的 DropDownButton:

declare module 'dijit/form/DropDownButton' {
    import Button = require('dijit/form/Button');
    interface DropDownButton extends Button {
    }
    var DropDownButton:{
        new (kwArgs?:Object, srcNodeRef?:HTMLElement):DropDownButton;
    };
    export = DropDownButton;
}

最后,在我的课堂上,事情看起来应该是这样的:

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

import HorizontalSlider = require('dijit/form/HorizontalSlider');

class MyDijit {
    constructor() {
        var foo = new HorizontalSlider(...);
    }
}

而且,我得到了可怕的 TS2304。

我的尝试

编译器似乎看不到 dijit dts。所以,我尝试将 dts 添加到 grunt-typescript 任务中。

typescript: {
    build: {
    src: ['src/**/*.ts', 'typings/tsd.d.ts'],
    options: {
        module: 'amd',
        target: 'es3',
        sourceMap: true,
        declaration: false
    }
}

我也尝试更新我的 tsconfig.json

{
    "compilerOptions": {
        "declaration": false,
        "module": "amd",
        "noImplicitAny": true,
        "target": "es3",
        "filesGlob": [
            "./src/**/*.ts",
            "./typings/tsd.d.ts"
        ]
    }
}

这也没有帮助!最后,考虑到编译器将这些类视为未使用,我什至尝试了这个:

/// <amd-dependency path="dijit/form/HorizontalSlider"/>

而且,没有运气。所以,我在 Stack Overflow 上,希望有一天能在 TypeScript 类中编译 dijit/form/xxx。有一个类似的 SO 问题,但不完全相同:Typescript cannot find name even though it is referenced

【问题讨论】:

    标签: javascript dojo typescript dijit.form


    【解决方案1】:
    declare module 'dijit/form/HorizontalSlider' {
        import _FormValueWidget = require('dijit/form/_FormValueWidget');
        interface HorizontalSlider extends _FormValueWidget {
        }
        export = HorizontalSlider;
    }
    

    你这里有一个模块,它只导出一个类型(不是一个值),因此你不能new它(见“difference between declare class and interface”)。您似乎想要一个导出类的模块:

    declare module 'dijit/form/HorizontalSlider' {
        import _FormValueWidget = require('dijit/form/_FormValueWidget');
        class HorizontalSlider extends _FormValueWidget { // interface -> class
        }
        export = HorizontalSlider;
    }
    

    【讨论】:

    • 嗯,我也是这么想的。但是,制作那个 dts 的人很聪明,而且比我知道的更多。我认为这样做是因为 Dojo 通过“mixins”支持多重继承。 _FormValueWidget 继承自 _WidgetBase,后者继承自其他三个类。在 TypeScript 中做到这一点的唯一方法是通过接口。
    • Ryan:我还用不同的代码示例更新了原始问题,这可能有助于解释那里发生了什么。
    猜你喜欢
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    相关资源
    最近更新 更多