Typescript:不能分配给类型错误

时间:2016-10-16 17:21:42

标签: javascript angular typescript angular2-cli

我是使用带有角度2的打字稿的新手。我使用的是角度为2-cli的版本1。编译时,我收到此错误说“不能分配给类型Assignment []”。我查看了数据类型,到目前为止它看起来还不错,但我不确定错误究竟是什么。谢谢你的帮助。

以下是控制台错误的照片。 enter image description here

data.ts文件 - 这是数组中出现的两个项目

export const Assignments: Assignment[] = [
  {
    "a_type": "one",
    "a_title": "Assignment 1",
    "symbol": 1,
    "show": false,
    "tooltip": {
        "left": 82
    },
    "buttonPos":{
        "left": 130
    },
    "printTop": 0,
    "instructions": "Instructions here",
    "due_date": "sept-15.png",
    "percentage": "10.png",
    "taskA": {
        "name": "Option A",
        "a_title": "Task A",
        "information": "Instructions for task A",
        "selectA": true
    }
}, {
    "a_type": "two",
    "a_title": "Assignment 2",
    "symbol": 2,
    "show": false,
    "sub_a_title": "Assignment Information",
    "tooltip": {
        "left": 200
    },
    "buttonPos":{
        "left": 250
    },
    "printTop": 250,
    "instructions": "Instructions here",
    "due_date": "29.png",
    "percentage": "10.png",
    "taskA": {
      "a_title": "Assignment 2 info",
        "name": "Option A",
        "information": "Instructions for task A",
        "selectA": false
    },
    "taskB": {
      "a_title": "Assignment 2 info",
        "name": "Option B",
        "information": "Instructions for task B",
        "selectB": false
    }
}
]

assignment.ts - 这是数据类型

export class Assignment {
    a_type: string;
    a_title: string;
    symbol: any;
    show: boolean;
    tooltip: any;
    left: number;
    buttonPos:any;
    printTop: number;
    instructions: string;
    due_date: string;
    percentage: string;
    taskA: any;
    name: string;
    information: string;
    selectA: boolean;
    taskB: any;
    selectB: boolean;
  }

2 个答案:

答案 0 :(得分:16)

这是因为对象文字的结构与Assignment结构不匹配。

Typescript是结构化类型,这意味着如果要使用类型,则结构需要匹配类型。这意味着如果你想通过制作对象文字来制作Assignment,那么文字就需要拥有该类型中的所有属性。

我看错了几件事

  1. 您遗失了nameinformation,因为它们嵌套在typeA中。这不起作用,因为它们需要在主结构中,因为这是Assignment

  2. 中定义的内容。
  3. 第一个对象

  4. 中需要taskB
  5. 您在对象的主要结构中遗漏了selectAselectB

  6. 可能还有其他的东西,但希望你明白这一点

    如果您想使选项可选,您可以使用?运算符

    interface Assignment {
      name?: string;
    }
    

    如果你想要嵌套,你也可以这样做

    interface Assignment {
      taskA?: { name: string },
      taskB?: { name: string }
    }
    

答案 1 :(得分:3)

错误很明显:

  

财产'左'缺失...

您的Assignment类声明了一个名为left的成员,但是您的两个json对象都没有它。
您还有一些未在json对象中设置的属性here's a working version in playground

如果需要,您可以声明属性是可选的:

class Assignment {
    a_type?: string;
    ...
}

但即使没有错误,你也有问题 您没有创建类Assignment的实例,只创建与类属性匹配的对象 它的工作原理是因为打字稿正在使用duck typing,但是如果你在Assignment中有方法,那么你的对象将没有这些方法。
你可以这样做:

export const Assignments: Assignment[] = [new Assignment(), new Assignment()];

Object.assign(Assignments[0], FIRST_JSON_OBJ);
Object.assign(Assignments[1], SECOND_JSON_OBJ);

或者你可以在Assignment中有一个构造函数,它接收这个json对象并初始化。