从TypeScript 1.0升级到1.8

时间:2016-08-21 18:01:18

标签: javascript typescript1.8 ignite-ui

我们正在将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中的类型验证更加严格,并且转换为<任何>不是一种选择,社区建议什么是处理这种情况的最佳方法?

1 个答案:

答案 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使用的东西)