和 js 的写法有些区别,主要还是类型检查
1,属性的初始化类型检查
1,首先,属性得在属性列表中定义,才能在初始化时使用。
class User {
name: string
age: number
constructor(name: string, age: number) {
this.name = name
this.age= age
}
}
2,默认的类型检查规则 strictPropertyInitialization: true
表示,如果在属性列表中定义了,那一定得初始化。
class User {
name: string
// Property 'age' has no initializer and is not definitely assigned in the constructor.ts(2564)
age: number
constructor(name: string, age: number) {
this.name = name
}
}
默认值对初始化的影响
举例,如果知道默认值的话,是可以简化赋值的。
class User {
name: string
age: number
gender: '男' | '女'
constructor(name: string, age: number, gender: '男' | '女') {
this.name = name
this.age = age
this.gender = gender
}
}
const user = new User('下雪天的夏风', 18, '男')
1,如果有默认值,则 new
时不用传参。
class User {
// ...
constructor(name: string, age: number, gender: '男' | '女' = '男') {
// ...
}
}
const user = new User('下雪天的夏风', 18)
2,如果在属性列表中就设置的默认值,那也不用初始化。 new
时不用传参,使用实例时想修改了再修改。
class User {
name: string
age: number
gender: '男' | '女' = '男'
constructor(name: string, age: number) {
this.name = name
this.age = age
}
}
const user = new User('下雪天的夏风', 18)
// 可修改
user.gender = '女'
2,可选和只读
class User {
readonly id: number
pid?: string
// ...
constructor(name: string, age: number) {
this.id = Math.random()
// ...
}
}
// ...
可选相当于 pid: string | undefined
3,访问修饰符
用于控制类中某个成员的访问权限。
public
公共的(默认),所有代码都可以访问。private
私有的,只能在类中访问,不能通过实例对象访问。命名一般会加下划线_
class User {
private _age: number;
public gender: "男" | "女" = "男";
constructor(_age: number) {
this._age = _age;
}
}
语法糖:如果一个属性,只是通过构造参数传递并直接赋值,则可简化写法。
class User {
name: string
constructor(name: string) {
this.name = name
}
}
简化写法:只要加上任意访问修饰符即可。
class User {
constructor(public name: string) {}
}
4,访问器 set 和 get
当在赋值时需要做一些限制,可以使用访问器通过方法来赋值,js 已实现的内容。
一般这种情况,也会把传递的属性变为私有,防止直接通过属性来赋值。
class User {
constructor(private _age: number) {}
set age(value) {
if (value < 100 && value > 0) {
this._age = value;
}
}
get age() {
return this._age;
}
}
const user = new User(100);
// 调用 set 方法。
user.age = 101;
console.log("user", user);
以上。