类型检查和类型推断
-
TypeScript的类型常常是给编译器检查用的,如
const user: User = { name: "Tom", age: 20, }编译成JavaScript后只有
const user = { name: "Tom", age: 20, } -
TypeScript大量使用类型推断
const users = [ { name: "Alice", age: 20 }, { name: "Bob", age: 22 } ];则自动推断为
{ name: string; age: number; }[]
匿名函数
const add = (a: number, b: number) => a + b
类似C++中的lambda表达式。=>后可以是函数体,也可以直接写返回值。如
const add = (a: number, b: number): number => a + b
就相当于
const add = (a: number, b: number): number => {
return a + b
}
TypeScript中大量使用匿名函数,是因为JavaScript中函数相当于普通值,可以被赋给变量
const names = users.map(user => user.name);
注意
user => ({
name: user.name,
age: user.age
})
=>后({})表示返回一个对象,而非函数体
null和undefined,unknown和any
-
null明确表示空值,而undefined表示不存在,或未提供的值。也就是说,null是程序员自己定义的,而undefined是对访问越界或未定义的值时的安全措施,如const user: User | null = getUser(); console.log(user?.name);若
user的类型是null,则user.name的类型是undefined。 -
unknown和any都表示一个不确定的类型,区别在于any完全绕过类型检查,unknown在使用前则必须进行类型检查,即类型安全的anylet value: unknown = "hello"; // 必须进行类型收窄才能使用 if (typeof value === "string") { console.log(value.toUpperCase()); }
注意
null和undefined是值,而unknown和any是类型
|、??、?.
|表示联合类型,如
let id: string | number;
id = 123;
id = "abc";
id既可以是string,也可以是number。
const name = user.name ?? "Unknown";
表示如果 user.name 是 null 或 undefined,就使用 "Unknown"。
const user: User | null = getUser();
console.log(user?.name);
表示如果user = null,则user?.name得到undefined。
Promise,async和await
-
Promise表示一个异步操作的返回结果,在未来某个时刻才会得到确切结果。一个Promise必然处于以下几种状态之一:- 待定(pending):初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled):意味着操作成功完成。
- 已拒绝(rejected):意味着操作失败。
Promise有构造函数:new Promise(executor)函数
executor接受两个函数作为参数:resolveFunc和rejectFunc。当resolveFunc或者rejectFunc被调用时,该 Promise 对象就会变为已解决(resolved)。const p = new Promise((resolve, reject) => { setTimeout(() => { Math.random() > 0.5 ? resolve('成功的数据') : reject(new Error('失败了')); }, 1000); });Promise不会阻塞主线程。 -
async和await是用同步方式写Promise链的语法糖。async用来声明一个异步函数。async function foo() { return 1; } // 等价于 function foo() { return Promise.resolve(1); }async函数永远返回Promise。返回普通值会被自动Promise.resolve包装,抛出的异常会变成rejected。await用来等待一个Promise完成,出现在async函数内部,暂停当前async函数执行,直到Promise对象settle,但是不阻塞主线程。async function test() { const result = await fetch("/api/user"); console.log(result); }