从TypeScript 1.0升级到1.8后,IgniteUI中缺少属性

Missing properties in IgniteUI after upgrade from TypeScript 1.0 to 1.8

本文关键字:IgniteUI 属性 0升 TypeScript      更新时间:2023-09-26

我们正在将TypeScript项目从1.0版本升级到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;最大长度:数量;文本模式:字符串;listitem: string [];buttonType:年代…'不能赋值给'string'类型的形参。

问题:考虑到TypeScript在1.8中对类型验证要严格得多,并且强制转换为<任何>都不是一个选择,社区建议处理这种情况的最佳方法是什么?

好的在typescript 1.6中增加了"严格的对象文字赋值检查"。这意味着你不能将不符合接口的对象作为参数传递!!

所以如果参数对象接口声明字段{field1, field2} -你可以传递{field1, field2} ONLY,但不能传递{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)