我无法理解下面的代码。
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
中应该进行哪些更改?
答案 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"
}
]