1 泛型T
createArray<T>(length: number, value: T): Array<T>
第一个T是定义了泛型类型T,后面是对T的使用 。也就是<>里面是定义泛型类型的
2 两个问号 ??
let x = foo ?? bar(); 等价于 let x = foo !== null && foo !== undefined ? foo : bar();
3 太号! 转换类型
- !把0、-0、null、""、false、undefined 或者 NaN转化为false,其他为true
4 ts中非空断言运算符
- !在类型检查器无法得出结论的情况下,可以使用新的后缀表达式运算符来断言其操作数为非null且未定义。具体来说,该运算x!产生xwithnull和undefinedexclude类型的值。类似于表单<T>x和的类型声明x as T,!非null声明运算符仅在发出的JavaScript代码中删除。
- 这个仅仅是为了在写ts的时候防止报错,编译结果还是点操作符号
- 5
- () => () => {}
- 等价于
- function a(){
- return function b()
- }
6
function promiseFunc = function(){
return new Promise(function(resolve, reject){
// ...
if(/* 异步任务执行成功 */) {
resolve(value)
} else {
reject(error)
}
})
}
async func(){
let res = await promiseFunc()
}
// 错误捕获
async func(){
try{
let res = await promiseFunc()
}catch(err){
alert(err)
}
}
在执行await promiseFunc() 时候内部实现机制就是resolve会正常返回,如果是reject就会把错误抛到外面,这估计和await内部实现有关。出了
闭包之后会把错误抛出去。
7
let a={name:'你好'}
let b=Object.assign(a,{name:'新数据',c:'ggg'})
Let c=a===b
c=true
这个两个是同一个对象
如果是为了重新生成对象,那么应该使用…语法
let b={…a,{name:'新数据'}}
8
构造函数-实例-原型对象
1 在每一个实例对象中同时有一个 constructor 属性,该属性指向创建该实例的构造函数,
2 通过构造函数得到的实例对象内部会包含一个指向构造函数的 prototype 对象的指针 __proto__。
3 任何函数都具有一个 prototype 属性,该属性是一个对象。构造函数的 prototype 对象默认都有一个 constructor 属性,指向 prototype 对象所在函数。
constructor===.__proto__.constructor 原型对象的constructor指向原型对象所在的函数那么也就是当前函数自己(默认情况下)
TS 知识点
接口
1 额外的属性检查
继承
1 理解 private
然而,当我们比较带有 private或 protected成员的类型的时候,情况就不同了。 如果其中一个类型里包含一个 private成员,那么只有当另外一个类型中也存在这样一个 private成员, 并且它们都是来自同一处声明时,我们才认为这两个类型是兼容的。 对于 protected成员也使用这个规则。(这段自己没有理解)
let greeterMaker: typeof Greeter = Greeter;
greeterMaker.standardGreeting = "Hey there!";
let greeter2: Greeter = new greeterMaker();
console.log(greeter2.greet());
我们创建了一个叫做 greeterMaker的变量。 这个变量保存了这个类或者说保存了类构造函数。 然后我们使用 typeof Greeter,意思是取Greeter类的类型,而不是实例的类型。 或者更确切的说,"告诉我 Greeter标识符的类型",也就是构造函数的类型。 这个类型包含了类的所有静态成员和构造函数。 之后,就和前面一样,我们在 greeterMaker上使用 new,创建 Greeter的实例。
函数
1 函数的完整类型
let myAdd: (x: number, y: number) => number =
function(x: number, y: number): number { return x + y; };
(x: number, y: number) => number 第一个冒号后面是定义了类型,两个参数加上返回值类型,然后等号后面是函数正在实际定义。
2
箭头函数能保存函数创建时的 this值,而不是调用时的值
3
class Handler {
info: string;
onClickGood = (e: Event) => { this.info = e.message }
}
这是可行的因为箭头函数不会捕获this,所以你总是可以把它们传给期望this: void的函数。 缺点是每个 Handler对象都会创建一个箭头函数。 另一方面,方法只会被创建一次,添加到 Handler的原型链上。 它们在不同 Handler对象间是共享的。
4
函数最后重载没看懂
推广一下自己开发的微信小程序,有兴趣的朋友可以玩一玩