4

我正在尝试将我的 app.js 转换为 app.ts,唯一缺少的是 jquery.unobtrusive-ajax.js 和/或 jquery.validate.unobtrusive.js 的 .d 文件。

当我使用 tsc 构建和编译时,它工作正常,但 VS2012 中的 WebEssentials 抱怨:

var $form = $('#myform');
$.validator.unobtrusive.parse($form); 

错误:

The property 'unobtrusive' does not exist on value of type 'Validator'

谢谢

4

3 回答 3

4

如果您没有类型信息,并且编译器无法推断类型,那么就会出现问题。

尽管您从命令行获取输出,但我仍然希望它会给出错误。Web Essentials 的执行力更强,这是该工具背后的理念。

如果您无法获取类型信息(检查 GitHub 上的“绝对类型”),您可以使用简化的定义来修复错误...

interface JQueryStatic {
    validator: any;
}

如果你有一个验证器的定义,你可以使用这个技巧来声明不引人注目,这样只会丢失类型信息而不是所有验证器。

这将丢失在验证器上的输入,但会修复错误。

取自http://www.stevefenton.co.uk/Content/Blog/Date/201301/Blog/Complex-TypeScript-Definitions-Made-Easy/

于 2013-03-02T10:04:04.567 回答
4

只是为了说明我认为 Steve 已经说过的话,如果您从 DeveloplyTyped 下载 d.ts,然后打开文件,您将看到Validator界面(以及其他定义)。扩展它很简单:

interface Validator {
    format(template: string, ...arguments: string[]): string;
    form(): bool;
    element(element: any): bool;
    resetForm(): void;
    showErrors(errors: any): void;
    numberOfInvalids(): number;
    setDefaults(defaults: ValidationOptions): void;
    addMethod(name: string, method: (value: any, element: any, ...params: any[]) => any, message?: any): void;
    addClassRules(rules: any): void;
    addClassRules(name: string, rules: any): void;

    // Just add the unobtrusive element to this (typed as `any` if you don't have time to do anything more)
    unobtrusive:any; 
}

JQuery扩展和接口的其余工作JQueryStatic已经在文件的其他地方为您完成。你不会在unobtrusive元素上得到任何类型的好处,但至少所有其余的Validator代码都会被类型检查。

于 2013-03-04T09:55:21.967 回答
0

我通过转换为任何解决了这个问题:

(<any>$.validator).unobtrusive.parse($form);

我确实喜欢打字稿,但由于缺少定义文件而阻碍了它的使用。我想这是一件小事 - tsc 工作正常 - 但如果 Visual Studio 会抱怨这样简单的事情,那么这对很多人来说都是个问题。

于 2013-03-03T06:33:11.940 回答