javascript - typescript :不可分配给类型错误

标签 javascript angular typescript angular2-cli

我不熟悉将 typescript 与 angular 2 结合使用。我使用的是 angular 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;
  }

最佳答案

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

Typescript 是一种结构类型 语言,这意味着类的类型和属性由其结构定义。如果结构匹配,则对象文字可以被视为类的一种类型。例如,假设我们有这个类

class Person {
  firstName: string;
  lastName: string;
}

与使用 new 关键字实例化类的常规方式不同,

let person: Person = new Person();
person.firstName = "Stack";
person.lastName = "Overflow";

我们可以使用以下内容:

let person: Person = {
  firstName: "Stack",
  lastName: "Overflow"
}

如果我们不包含 lastName 属性,我们会得到一个编译错误,因为 structurePerson 的结构不匹配类,我们尝试将其键入为 Person

就您的代码而言,我看到的一些错误是:

  1. 您缺少 nameinformation,因为它们嵌套在 typeA 中。这不起作用,因为它们需要位于主结构中,因为这是在 Assignment

    中定义的
  2. 第一个对象需要taskB

  3. 对象的主要结构中缺少 selectAselectB

可能还有更多的错误,但希望你明白了

如果你想让事情变得可选,你可以使用?操作符

interface Assignment {
  name?: string;
}

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

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

另请参阅:

关于javascript - typescript :不可分配给类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40073164/

相关文章:

javascript - 加速 jQuery/Javascript 搜索功能

javascript - Angular 自定义组件中的不一致验证问题

javascript - 如何在 typescript 中模拟 XMLHTTPRequest 以进行单元测试

javascript - 如何阻止 VS 2013 生成 TypeScript 映射文件

javascript - 在不破坏兼容性的情况下以交互方式在javascript中加载图像

javascript - 在 mac 上工作但不能在机器上工作 - linux ubuntu - Node 服务器

html - 如何创建更好的可展开/折叠 div?

WebStorm 2016.3 中的 TypeScript 支持 - 像 VS Code 中的工具提示

typescript - 如何配置 typescript 源 map 文件夹

javascript - 如何重新初始化已从 DOM 中删除的按钮?