TypeScript一问一答02

66 阅读2分钟

初入

是否已经熟悉初篇内容? 是的 请收取自动编译的口令

"scripts": {
    "auto": "tsc --watch"
 },

如果出现TypeScript报错怎样能阻止编译呢? TypeScript的内功心法即编译流程如下图

image.png

所以要配置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
}

仓库地址