本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1、在声明interface后,当我们给函数的参数指定好interface,ts检查的是:
(1) 必须包含 接口指定的属性且类型正确
(2)不能包含接口定义外的属性名
(3)非必选属性如果存在则检查其类型是否正确。
逃避检查的方式
(1)使用类型断言 (someValue as XXX)|| <类型>someValue
(2) 添加一个字符串索引签名:
interface SquareConfig { color?: string; width?: number; [propName: string]: any; }
(3) 将对象赋值给另一个变量,这个变量不会经过额外的属性检查,在传递给函数是传入这个变量。
let squareOptions = { colour: "red", width: 100 };
let mySquare = createSquare(squareOptions);
2、interface 和 type的区别。 type可以声明基础数据类型
3、声明可索引类型
interface Array { [index: number] : number }
4、混合类型
5、派生类包含了一个构造函数,它必须调用super(),它会执行基类的构造函数。 而且,在构造函数里访问this的属性之前,我们一定要调用super()。 这个是TypeScript强制执行的一条重要规则。
6、class之间的继承(extends)会继承基类的所有属性(public、private、protected),如果遇到相同的方法就发生了重写。
7、 private只能在类的内部使用,除此之外在哪里都不能用 class.name 🙅 || 在派生类中访问也是不可以的。
8、protected属性可以在派生类内部继承时使用,但是不可以在类实例化后直接访问/
9、简单来说:继承就是可以继承基类中所有的内容,在派生类中的构造函数中需要先使用super()先来初始化基类的构造函数,在访问this。如果基类中有私有属性那么只能在基类的内部使用,基类实例不能访问,在派生类中也不可以访问。如果基类中有protected属性,基类实例不可以访问,在派生类内部可以访问,派生类的实例也不可以直接访问。如果构造函数是protected声明,那么他不能够直接实例化可以在继承它时在派生类中实例化他。
10、静态属性 static关键字来声明静态属性。 当类没有实例化的时候我们仍然可以访问的属性。 在类的内部访问 类名.属性名
class Grid {
static origin = {x: 0, y: 0};
calculateDistanceFromOrigin(point: {x: number; y: number;}) {
let xDist = (point.x - Grid.origin.x);
let yDist = (point.y - Grid.origin.y);
return Math.sqrt(xDist * xDist + yDist * yDist) / this.scale;
}
constructor (public scale: number) { }
}
let grid1 = new Grid(1.0);
let grid2 = new Grid(5.0);
console.log(grid1.calculateDistanceFromOrigin({x: 10, y: 10}));
console.log(grid2.calculateDistanceFromOrigin({x: 10, y: 10}));
11、 声明抽象类:abstract关键字