初入
是否已经熟悉初篇内容? 是的 请收取自动编译的口令
"scripts": {
"auto": "tsc --watch"
},
如果出现TypeScript报错怎样能阻止编译呢? TypeScript的内功心法即编译流程如下图
所以要配置emit阻止转化为JavaScript,如下所示
{
"compilerOptions": {
"noEmitOnError": true, /* 默认是true,自动阻止语法错误文件编译为JS. */
}
}
不错,不错,对本门心法很是了解 不敢,不敢 你知道JavaScrip默认编译版本是什么吗? ES3,现改为
{
"compilerOptions": {
"target": "es3"
}
}
好的进入实战吧!
进阶
你知道原始元素吗? 知道,如下
let meta: undefined = undefined
let neil: null = null
let str: string = 'hi'
let num: number = 1
let bol: boolean = false
// es3 不支持 会报错
let sym: symbol = Symbol('sym')
let bigInt: bigint = 23n
你可以利用操作符和原始元素组合做一些事情吗? 可以,例如做一些简单的计算,字符串组合
12 + 12 // 24
const firstName: string = 'jack '
const secondName: string = 'leno'
firstName + secondName
这样做的话,信息比较杂乱,有没有更好的聚合原始元素的方法? 当然有,可以通过 function object聚合信息,也可以叫做原始元素的模块化
function double(num: number): number {
return num * 2
}
let person:{
firstName: string,
secondName: string
} = {
firstName: 'jack',
secondName: 'leno'
}
let arr: number[] = [1]
arr.push(1)
// Type 'string' is not assignable to type 'number'.
arr = ['1']
// Argument of type 'string' is not assignable to parameter of type 'number'.
arr.push('string')
let tuple: [number,string] = [1, '1']
tuple.push(1)
tuple.pop()
// Type '[number]' is not assignable to type '[number, string]'.
// Source has 1 element(s) but target requires 2.
tuple = [1]
上面的例子的类型系统表示方法是什么呢? 上面是注解的方式去表示类型,可以通过类型变量的方式抽离类型,方便复用
type Primitive = string | number | boolean | bigint | symbol | undefined | null
type Double = (num: number) => number
interface Person {
firstName: string
lastName: string
}
type TPerson = {
firstName: string,
lastName: string
}
type和interface可以干很多相同的事情,但他们俩有什么区别吗? 主要区别在于,如果 Person 类型增加了 age:number 原始元素类型定义,type不能像interface一样直接扩展
interface Person {
age: number
}
// 报错 Duplicate identifier 'TPerson'.
type TPerson = {
age: number
}