'X' 类型的参数不可分配给 'X' 类型的参数

Argument of type 'X' is not assignable to parameter of type 'X'

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

出现以下错误:

  1. error TS2322: Type '() => string' is not assignable to type 'string'.

  2. error TS2322: Type '() => number' is not assignable to type '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 class:

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);
        }
    }
}

我们将不胜感激任何帮助。

你漏掉了括号:

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

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

  1. First Check you compiler version, Download latest Typescript compiler to support ES6 syntaxes

  2. typescript still produces output even with typing errors this doesn't actually block development,

当您在初始化或调用这些方法或变量时看到这些错误检查语法时,
检查函数的参数是否是错误的数据类型,你初始化为'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 根据分配的值进行类型转换,因此打字稿会通知它们,但即使这些错误在 VS Code

中突出显示,代码也会执行

例如:

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

无论如何,如果有人只在 VSCode 中遇到此问题,只需重新启动 VSCode 即可解决。有时,Intellisense 似乎会混淆导入或类型。

相关

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

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

我有 .map(key = > 而不是 .map(key =>

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

当您的编译器无法理解将字符串类型的转换运算符转换为数字之间的区别时,这个问题基本上就会出现。

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

在我的例子中,我有一个名为 Item 的自定义界面,但由于 auto-completion、angular 项 class,我不小心导入了。确保您从正确的包中导入。

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

错误代码:

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

给定错误 “{}”类型的参数不可分配给 'string'.[=12 类型的参数=]

成功代码:

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

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

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

我在这个案例中得到了这个

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

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

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

对于无法避免此错误的场景,我们可以@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