7

我有以下代码:

var modal = {
    content: '',
    form: '',
    $form: '',
    $message: '',
    $modal: '',
    $submits: '',
    href: ''
}

$.modal = function (options) {
    var settings = $.extend({}, $.modal.defaults, options),
        root = getModalDiv(),
    function getModalDiv() {
        var modal = $('#modal');
        return modal;
    };
})(jQuery);

modal.$modal = $.modal({
    title: link.title,
    closeButton: true,
    content: modal.content,
    onClose: onModalClose,
    minWidth: 315,
    maxHeight: false,
    width: false,
    resizeOnLoad: true
});
modal.$form = modal.$modal.find('.form');

我收到一个指向 .find 的错误并说:

“字符串”类型的变量上不存在属性 find。我明白错误在说什么,但我如何定义$modal一个我可以使用的变量.find

另外,现在我在打字稿世界中,有没有比我在这里将其定义为 var 更好的方法来定义模态?

4

1 回答 1

6

我认为您的代码正在执行的功能分配是$.modal不完整的——但是,由于您是专门询问定义类型的,所以无论如何我都会尝试回答。

因此,首先,如果您还没有:从 codeplex获取 jquery.d.ts并在您的代码中引用它,如下所示。它将为您提供 jQuery 的类型声明,这在使用该库时非常有用。它还允许您定义应该是 jQuery 对象的成员。

///<reference path="jquery.d.ts" />

举个例子,看看IModal哪个是一个有 4 个 jQuery 成员的接口(我猜了一些你想在其他成员上使用的类型——它们可能不是你想要的):

interface IModal {
    content : string;
    form    : HTMLFormElement;
    $form   : JQuery;
    $message: JQuery;
    $modal  : JQuery;
    $submits: JQuery;
    href    : string;
}

第二个接口声明,JQueryStatic简单地声明另一个静态成员,该成员可以在$对象上访问(见脚注),因为在 jquery.d.ts 文件中$实现。JQueryStatic

interface JQueryStatic {
    modal : any;
};

有了这个,您现在可以使用IModal它实现的接口提供的显式类型信息创建模态对象:

var modal : IModal = {
    content : '',
    form    : null,
    $form   : null,
    $message: null,
    $modal  : null,
    $submits: null,
    href    : ''
}

您可以根据附加功能将您的功能分配给 $.modal JQueryStatic

$.modal = function (options) {
    var settings = $.extend({}, $.modal.defaults, options),
        root = getModalDiv(),
        getModalDiv = function() {
            var modal = $('#modal');
            return modal;
        };

    ...
})(jQuery);

有了它,并且如果您更正了该分配,那么下面的行现在应该可以了:

modal.$form = modal.$modal.find('.form');

注意:我向现有接口添加成员的经验充其量是不确定的——通常编译器出于任何原因都不会选择它们。我发现随着代码库的增长,这种情况更有可能发生,因此很难找出确切的原因。只是需要注意的事情。

于 2012-10-31T07:51:25.423 回答