【问题标题】:Argument of type 'X' is not assignable to parameter of type 'X'“X”类型的参数不能分配给“X”类型的参数
【发布时间】:2016-04-16 18:44:43
【问题描述】:

美好的一天。我是 Type Script 的新手,使用 VSCode。

出现以下错误:

  1. 错误 TS2322:类型 '() => string' 不可分配给类型 'string'。

  2. 错误 TS2322:类型“() => number”不可分配给类型“number”。

代码:

DTO.ts

interface DTO {

    getId(): number;
    getValue(): string;
}
export = DTO;

LinkedObject.ts

class LinkedObject {

    public value: string = "Not Set";
    public id: number = 0;

    constructor(value?: string, id?: number) {
        this.value = value;
        this.id = id;
    }
}
export = LinkedObject;

我正在尝试使用上述接口方法实例化LinkedObject 类:

TravelClientFormPopulator.ts

class TravelClientFormPopulator {

    public populateComboBoxUsingDTOs(dataObjects: Array<DTO>, comboBoxID: string): void {

        // Get the combo box
        var selectElement = <HTMLSelectElement> document.getElementById(comboBoxID);
        // Reset the options 
        selectElement.options.length = 0;

        var linkedObjectsToAdd: LinkedObject[] = new Array<LinkedObject>();

        var defaultLinkedObject: LinkedObject = new LinkedObject("Not Selected", 0);

        linkedObjectsToAdd.push(defaultLinkedObject);

        for (var i = 0; i < dataObjects.length; i++) {
            var value: string = dataObjects[i].getValue; // Error here
            var id: number = dataObjects[i].getId; // And here
            var linkedObject: LinkedObject = new LinkedObject(value, id);
        }
    }
}

任何帮助将不胜感激。

【问题讨论】:

    标签: typescript visual-studio-code


    【解决方案1】:

    对于这个错误无法避免的场景,我们可以@ts-ignore这个错误。
    在我的情况下,我必须将一个字符串参数传递给 isNaN,它的 ts 定义只允许数字类型的参数。

    // @ts-ignore: Argument of type 'string' is not assignable to parameter of type 'number'.
     if (isNaN(myParam)) { // myParam is of string type 
          throw new Error('myPram should be a number');
     }
    // but isNaN can accept string params too in javascript
    isNaN(123) //false
    isNaN('123') //false
    isNaN(NaN) //true
    isNaN('NaN') //true
    

    【讨论】:

      【解决方案2】:

      我在这个案子上得到了这个

      ...
      .then((error: any, response: any) => {
        console.info('document error: ', error);
        console.info('documenr response: ', response);
        return new MyModel();
      })
      ...
      

      在这种情况下,将参数设为可选将使 ts 停止抱怨

      .then((error?: any, response?: any) => {
      

      【讨论】:

        【解决方案3】:

        您只需使用变量类型 any 并消除这些类型的问题。

        错误代码:

          let accessToken = res;
          localStorage.setItem(LocalStorageConstants.TOKEN_KEY, accessToken);
        

        给定错误“{}”类型的参数不可分配给“字符串”类型的参数。

        成功码:

          var accessToken:any = res;
          localStorage.setItem(LocalStorageConstants.TOKEN_KEY, accessToken);
        

        我们创建 var 类型变量,然后使用变量类型 any 并解决此问题。

        any = 处理任何类型的值以便消除错误。

        【讨论】:

        • 将类型设置为 any 会回到弱输入代码,实际上更容易出现输入错误
        【解决方案4】:

        在我的例子中,我有一个名为 Item 的自定义接口,但由于自动完成,我意外地导入了 Angular Item 类。确保您从正确的包中导入。

        【讨论】:

          【解决方案5】:

          这个问题基本上是当你的编译器无法理解类型 string 到 Number 的强制转换运算符之间的区别时出现的。

          您可以使用 Number 对象并通过使用 Number(>>>) 来传递您的值以获得适当的结果

          【讨论】:

            【解决方案6】:

            我正在做 angular 2 和打字稿,但我没有意识到我的箭头符号中有一个空格

            我有.map(key = &gt; 而不是.map(key =&gt;

            一定要留意愚蠢的语法错误

            【讨论】:

              【解决方案7】:

              就我而言,奇怪的是,我错过了它所抱怨的类的导入,而我的 IDE 没有检测到它。

              【讨论】:

                【解决方案8】:

                不管怎样,如果有人只在 VSCode 中遇到这个问题,只需重新启动 VSCode,它应该可以解决它。有时,Intellisense 似乎会混淆导入或类型。

                Typescript: Argument of type 'RegExpMatchArray' is not assignable to parameter of type 'string'相关

                【讨论】:

                • 或重新打开打开的 vs 代码文件选项卡
                【解决方案9】:

                还添加了您可能会看到这些错误的其他场景

                1. 首先检查你的编译器版本,下载最新的Typescript编译器 支持 ES6 语法

                2. 即使出现输入错误,typescript 仍会产生输出 实际上阻​​碍了开发,

                当您在初始化或调用这些方法或变量时看到这些错误检查语法时,
                检查函数的参数是否是错误的数据类型,你初始化为'string'并分配'boolean'或'number'

                举例

                1.

                 private errors: string;
                    //somewhere in code you assign a boolean value to (string)'errors'
                    this.errors=true
                    or 
                    this.error=5
                

                2.

                 private values: Array<number>;    
                    this.values.push(value);  //Argument of type 'X' is not assignable to parameter of type 'X'
                

                这里的错误消息是因为缺少数组初始化的方括号,即使没有它也可以工作,但是 VS Code 红色警报。

                private values: Array<number> = [];    
                this.values.push(value);
                

                注意:
                请记住,Javascript 根据分配的值进行类型转换,因此 typescript 会通知它们,但即使在 VS Code 中突出显示这些错误,代码也会执行

                例如:

                 var a=2;
                 typeof(a) // "number"
                 var a='Ignatius';
                 typeof(a) // "string"
                

                【讨论】:

                  【解决方案10】:

                  你错过了括号:

                  var value: string = dataObjects[i].getValue(); 
                  var id: number = dataObjects[i].getId();
                  

                  【讨论】:

                  • 了解错误的含义对您将来也有帮助。 Type '() =&gt; string' is not assignable to type 'string'. 在这种情况下基本上是说“返回字符串的函数不能分配给字符串类型的变量”一旦您正确阅读了() =&gt; string,它应该都是有意义的。如果它是纯 JS,你就不会出错,而且你的变量会指向一个函数而不是返回的值,而且追踪发生的事情会更加困难。
                  • 当我意识到这一点时,感觉自己像个白痴。
                  猜你喜欢
                  • 2019-01-27
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-04-25
                  • 1970-01-01
                  • 2019-09-12
                  • 2021-03-02
                  相关资源
                  最近更新 更多