我们正在将TypeScript项目从1.0版升级到TypeScript 1.8。 我们现在也使用最新的IgniteUI定义文件(v 16.1),它(在Typescript版本更改之后)不能与我们现有的对象初始化一起使用(请参阅本文底部的错误)。
这是我们使用IgniteUI igTextEditor的现有TypeScript代码:
$(this.textinput).igTextEditor({
maxLength: this.maxChars,
textMode: sTextMode,
listItems: [""],
buttonType: "dropdown",
dropDownListOpening: function (evt, ui) {
formBase.setActiveForm(self.formID);
self.buttonClicked();
return false;
},
// Validator Options
validatorOptions: {
onblur: true,
onchange: false,
required: this.required,
notificationOptions: {
direction: "right",
showIcon: "true",
mode: "popover"
},
custom: function (value, fieldOptions) {
if (self.showError) {
self.showError = false;
if (self.errorMessage.length > 0) {
$(this.element).igValidator("option", "errorMessage", self.errorMessage);
}
return false;
}
self.validate(value);
return true;
}
},
keyup: function (evt, ui) { if (evt.keyCode == 13) { $(evt.currentTarget).blur() } },
focus: function () { formBase.setActiveForm(self.formID) }
});
以下是来自igniteui.d.ts的相关接口定义:
interface IgTextEditor {
textMode?: string;
maxLength?: number;
includeKeys?: string;
excludeKeys?: string;
toUpper?: boolean;
toLower?: boolean;
listMatchIgnoreCase?: boolean;
listMatchOnly?: boolean;
listMatchContains?: boolean;
listAutoComplete?: boolean;
}
interface JQuery {
igTextEditor(options: IgTextEditor): JQuery;
igTextEditor(optionLiteral: string, options: IgTextEditor): JQuery;
igTextEditor(optionLiteral: string, optionName: string, optionValue: any): JQuery;
igTextEditor(optionLiteral: string, optionName: string): any;
igTextEditor(methodName: string): any;
}
此代码中来自igniteui.d.ts的唯一更改来自:
igTextEditor(optionLiteral: string, optionName: any, optionValue: any): JQuery;
到:
igTextEditor(optionLiteral: string, optionName: string, optionValue: any): JQuery;
升级到TypeScript 1.8后,我们收到以下错误:
错误TS2345 :构建:类型'{[x:number]的参数:undefined; maxLength:number; textMode:string; listItems:string []; buttonType:s ...'不能赋值给'string'类型的参数。
问题:考虑到TypeScript在1.8中的类型验证更加严格,并且转换为<任何>不是一种选择,社区建议什么是处理这种情况的最佳方法?
答案 0 :(得分:2)
好 在typescript 1.6中添加了“Strict object literal assignment checking”。 这意味着你不能作为不符合界面的参数对象传递!!确实!!
因此,如果参数对象接口声明字段{field1,field2} - 您只能传递{field1,field2}但不能传递{field1}或{field1,field2,field3}
示例:
var obj:{id:number}; obj = {id:1,name:“my object”} - 将是一个错误 - 因为'name'没有在obj声明中定义。
要传递其他字段,需要使用索引器
var obj:{id:number,[x:string] any}; 并且您可以传递任何其他字段
记住严格类型并检查所有对象是否100%满足接口(可能是过时的IgniteUI使用的东西)