我正在尝试将我的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'
由于
答案 0 :(得分:4)
如果您没有类型信息,并且编译器无法推断出类型,那么就会出现问题。
虽然您从命令行获取输出,但我仍然希望它会出错。 Web Essentials强制执行更强大的功能,这是工具背后的理念。
如果您无法获取类型信息(请检查GitHub上的Definitely Typed),您可以使用简化的定义修复错误...
interface JQueryStatic {
validator: any;
}
如果你有一个验证器的定义,你可以使用这个技巧来声明不引人注目的,然后只有缺少类型信息而不是所有的验证器。
这将失去验证器的输入,但会修复错误。
取自http://www.stevefenton.co.uk/Content/Blog/Date/201301/Blog/Complex-TypeScript-Definitions-Made-Easy/
答案 1 :(得分:4)
为了说明我认为史蒂夫已经说过的话,如果你download the d.ts from DefinitelyTyped,并打开文件,你会看到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
代码都将进行类型检查。
答案 2 :(得分:0)
我通过强制转换来解决这个问题:
(<any>$.validator).unobtrusive.parse($form);
我喜欢打字稿但由于缺少定义文件而妨碍了它的使用。我想这是一件小事--Tsc工作得很好 - 但如果Visual Studio会抱怨像这样的简单事情,那么对很多人来说这将是一个问题。