类如何成为Typescript中的数据类型?

时间:2018-04-02 12:14:59

标签: typescript

我无法理解下面的代码。

export class Movie {
    id:number;
    movieName:string;
    genre:string;
}

现在,从Movie类创建了一个数据类型或对象列表。这是代码:

    import { Movie } from "./movie";

    export var FakeMovies : Movie[] = [
    {
        id : 1,
        movieName : "Avatar",
        genre : "Action/ SiFi"
    },
    {
        id : 2,
        movieName : "3 Idiots",
        genre : "Funny"
    }
]

我的问题是,如果它是一组对象,那么为什么使用Movie[]?因为Movie是一个类,不是数组吗?有人可以解释一下这段代码吗?如果fakeMovies类上有构造函数,Movie中应该进行哪些更改?

2 个答案:

答案 0 :(得分:1)

在提供的示例中,Movie是一个包含三个字段的类:(1)类型为id的{​​{1}},{2}类型为number的{​​{1}} }和(3)movieName类型的string。默认情况下,没有可见性修饰符的字段为genre(请参阅官方Typescript documentation)。在Typescript中,与JavaScript一样,可以使用JavaScript Object Notation(JSON)创建对象,为每个字段提供值。因此,string的代码段是public个对象(其中两个)的数组,每个对象都使用JSON为字段提供值(将字段的名称/键映射到其各自的值)。

如果您有FakeMovies类的构造函数,例如以下

Movie

您可以按如下方式创建数组:

Movie

请注意,您还可以通过创建export class Movie { id:number; movieName:string; genre:string; constructor(id: number, movieName: string, genre: string) { this.id = id; this.movieName = movieName; this.genre = genre; } } export var FakeMovies : Movie[] = [ new Movie(1, "Avatar", "Action/ SiFi"), new Movie(2, "3 Idiots", "Funny") ]; 字段来缩短构造函数定义,这是Typescript的惯例(请参阅Encapsulation)。这会将Movie类减少到以下内容:

private

答案 1 :(得分:1)

Typescript使用结构兼容性来确定类型之间的兼容性。在您的示例中,Movie类只有3个公共属性,因此具有这3个属性的 ANY 对象将与Movie类兼容,但这并不意味着它们实际上是Movie类的实例。在您的情况下,FakeMovies[0] insrtanceof Movie将为假。

如果要实际创建影片类的实例,可以定义构造函数并使用它来创建类的对象:     出口类电影{         构造函数(public id:number,public movieName:string,public genre:string){}     }

export var FakeMovies : Movie[] = [
    new Movie(1, "Avatar", "Action/ SiFi"),
    new Movie(2, "3 Idiots", "Funny")
];

您也可以新建对象并单独设置字段(let m = new Movie(); m.id = 10; ...

如果要确保人们没有分配与Movie具有相同形状但实际上不是Movie的实例的对象文字,则可以创建将呈现任何对象的私有字段字面意思与Movie

不兼容
export class Movie {
    private nonStructural!:true;
    constructor(public  id: number, public  movieName: string, public  genre: string) {}
}
// will now be an error
export var FakeMovies2 : Movie[] = [
    {
        id : 1,
        movieName : "Avatar",
        genre : "Action/ SiFi"
    },
    {
        id : 2,
        movieName : "3 Idiots",
        genre : "Funny"
    }
]