Не удается найти Dojo dijit / form / xxx внутри класса TypeScript

Моя проблема

Мне очень удалось создать классы TypeScript, которые импортируют классы Dojo, такие как array, lang, Deferred, on, dom-construct и все такое. Впервые я пытаюсь вытащить кое-что из диджита. В частности, dijit / form / HorizontalSlider и dijit / form / VerticalSlider. Но когда я компилирую, я получаю:

error TS2304: Cannot find name 'HorizontalSlider'

Мой код

У меня есть проект tsd.d.ts, который выглядит так:

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

Я использую dts от Mayhem, потому что они лучше, чем типизация в DefinentyTyped (https://github.com/SitePen/mayhem/tree/master/typings/dojo). Вот определение HorizontalSlider:

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

РЕДАКТИРОВАТЬ: чтобы уточнить этот синтаксис, основанный на ответе Райана Кавано, вот DropDownButton из того же dts:

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 в надежде, что когда-нибудь получится dijit / form / xxx для компиляции внутри класса TypeScript. Есть один похожий вопрос SO, но не совсем такой: Typescript не может найти имя, даже если на него есть ссылка


person AJ Morris    schedule 11.05.2015    source источник


Ответы (1)


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

У вас есть модуль, который экспортирует только тип (не значение), поэтому вы не можете new его (см. " разница между declare class и interface"). Похоже, вам нужен модуль, который вместо этого экспортирует класс:

declare module 'dijit/form/HorizontalSlider' {
    import _FormValueWidget = require('dijit/form/_FormValueWidget');
    class HorizontalSlider extends _FormValueWidget { // interface -> class
    }
    export = HorizontalSlider;
}
person Ryan Cavanaugh    schedule 11.05.2015
comment
Ну, я тоже так думал. Но ребята, которые сделали этот dts, умны и знают больше меня. Я думаю, что так сделано, потому что Dojo поддерживает множественное наследование через миксины. _FormValueWidget наследуется от _WidgetBase, который наследуется от трех других классов. Единственный способ сделать это в TypeScript - через интерфейсы. - person AJ Morris; 11.05.2015
comment
Райан: Я также обновил исходный вопрос, добавив другой образец кода, и это может помочь объяснить, что там происходит. - person AJ Morris; 11.05.2015