TypeScript 语法基础 第一部分 基础类型

【视频链接】

官网链接

环境配置:

  1. 安装:node
  2. 安装:typescript
  3. 初始化ts:tsc --init , 自动创建tsconfig.json文件
  4. 修改tsconfig.json中的配置生效:"experimentalDecorators": true,
  5. 安装ts-node:npm i ts-node -g,使用ts-node命令可以直接编译ts文件,不必再转为js
  6. 创建ts文件:index.ts
  7. 编译ts代码:ts-node index.ts

TypeScript 语法基础 第二部分 类、接口、泛型

文章链接

1. 类型

  • typescript对类型进行强制的管理

这里只记录typescript特有的

1.1 | 联合类型

let a : number | string //变量a可以是number也可以是string
// 数组元素可以是联合类型中的任意一种
let arr: (number|string|boolean)[] = [1,2,3]

arr[0] = '1'
arr[2] = true

1.2 字面量类型

  • 可以限制变量的取值范围
// c的类型只能是10,不是number
let c : 10

c = 11 // 报错:Type  11  is not assignable to type  10 

应用:d的值被限定在两个字符串

let d : 'man' | 'woman'

d = "man"
d = "woman"

1.3 any 任意类型

  • any类型的变量给以赋值给任意变量,又增加了变量类型的不确定性,不建议使用
let b : any 
b = 10
b = "字符串"

1.4 unkown 类型

未知类型,使用前需要typeof做类型判断

  • 错误示例
let e : number = 10
let f : unknown = 10

e = f //报错:Type  unknown  is not assignable to type  number 
  • 正确用法
let e : number = 10
let f : unknown = 10

if (typeof f === "number"){
    e = f
}

1.5 as 类型断言

假如又一个变量a,解析器不知道是什么类型,但我们确定a的类型为某个类型

  • 下面代码不会报错,但用法是错的,如果要断言a是数字那程序员一定要确保a一定会是number
let a : unknown = 'abcd'
let b : number 

b = a as number
// 另一种断言的写法
b = <number>a
  • 编译后的js文件内容:
    很明显因为断言,b的类型成为了string,会导致未知的错误
let a = 'abcd';
let b;
b = a;

1.6 object 对象类型

  • 示例中object属性并没有对变量做很好的限制,一般不使用

object的范围太广泛,示例中a可以是对象也可以是函数

let a : object

a = {name:'jack',age:18}

a = function (a:number,b:number) : number{
    return a + b
}

1.7 { } 对象类型

  • 很明显{}object对类型的限制没有起到约束作用
let a : {} // a类型为{}
// 无论 a 的值是对象或函数,都不会报错

a = {name:'jack',age:18}
a = function (a:number,b:number) : number{
    return a + b
  • {} 正确用法
let a : {name: string, age: number}

a = {name: 'jack', age: 18}

1.8 对象中的可选属性

  • 带有?的属性可有可无
let a : {name: string, age?: number}

a = {name: 'jack', age: 18}

a = {name: 'jack'}

1.9 对象中的任意属性

  • [b:string]:any 表示属性名是字符串,值是任意类型
  • [b:string]:string 表示属性名是字符串,值也是字符串
// a对象中只要有name:string属性,其他都无所谓
let a : {name: string, [b:string]:any}

a = {name: 'jack', age: 18, sex: true}

a = {name: 'jack'}
// 报错,因为id属性的值是number类型,所以b属性必须要包含number属性
let e : {id: number, [b:string]:  string }
// 修改为:
let e : {id: number, [b:string]:  string | number}

1.10 & 同时满足条件

let a : {id: number} & {name:string }

a = {id: 1, name: "a"}
  • 不能用于 []

1.11 function 函数的类型限制

  • 对函数的类型限制就是限制参数的类型返回值的类型
let b : (a: number, b: string) => boolean

b = function (a: number, b: string):boolean{
    return true
}

function c (a: number, b: string) : boolean{
    return true
}

1.12 void 空值

  • void用于函数的返回值类型,没有return语句或者返回undefined
function fun(): void{
    return undefined
}

1.13 nerver 没有返回值

  • 有没有return返回的类型都不能是nerver,一般用于抛出异常
function fun(): never{
    throw new Error('报错')
}

1.14 Array 数组

  • 第一种方式
let a : string[]

a = ['a', 'b']

  • 第二种方式
let b : Array<String>

b = ['a', 'b']
  • 数组元素是对象
let c : Array<{[a:string]:number}>

c = [{a:1}, {b:2}]
  • 元素是对象并且对象中属性的值不是同一种类型
let d : Array<{id: number, [b:string]:string | number}>

d = [{id:1,name:'jack'}]

1.15 元组类型(特殊数组)

  • 元组类型是一种特殊的数组类型,它允许你明确地指定数组中每个元素的类型。元组类型在需要明确知道数组中元素数量和类型的情况下非常有用。
type Tuple = [number, string];

const tuple: Tuple = [1, "hello"];

1.16 emun 枚举

  • 属性的值在确定的范围以内,建议使用emun类型
enum Gender{
    MALE = 1,
    FEMALE = 2,
    OTHER = 3
}
let a : {id:number,name:string,gender:Gender}

a = {
    id:1,
    name:"zhangsan",
    gender:Gender.FEMALE
}

if(a.gender == Gender.FEMALE){
    console.log("女")
}

1.17 type 类型别名

  • a就是string类型的别名,在后续的代码中用a可以代替string使用
type a = string;

let b : a

b = "hello"
  • 字面量类型配合使用,可以用于限制变量的值,感觉和枚举有相似的地方
type c = 1 | 2 | 3

let d : c // d的类型就是 1 | 2 | 3

d = 1

1.18 索引签名(类型)

  • 可以通过索引获取到值,索引只能是number或者string类型
// 定义索引类型,通过key获取到值;key的类型是sting,值的类型也是string 
interface InfoType {
	[key:string]:string
}
// 定义函数的返回值类型为索引类型
function getInfo(): InfoType {
	// todo
	return x
}

const info = getinfo()
// 索引类型:可以通过 key获取到 value
console.log(x.name)
console.log(x.age)
  • length属性,key是number
interface StringArray {
  [index: number]: string;
  length: number // 这个属性可有可无
}
// 数组是索引签名类型,不同于上面的例子,索引是number类型
let myArray: StringArray = ["Alice", "Bob", "Charlie"];

let myStr: string = myArray[0]; // myStr 的值是 "Alice"

// 带有length属性的索引签名类型可以使用for遍历
// 不能使用for...of遍历(StringArray 没有迭代器)
function test(x:StringArray) {
    for(let i = 0; i < x.length; i++)
    console.log(x[i])
}
test(myArray)

尚硅谷官方资料

第一章 快速入门

0、TypeScript简介

  1. TypeScript是JavaScript的超集。
  2. 它对JS进行了扩展,向JS中引入了类型的概念,并添加了许多新的特性。
  3. TS代码需要通过编译器编译为JS,然后再交由JS解析器执行。
  4. TS完全兼容JS,换言之,任何的JS代码都可以直接当成JS使用。
  5. 相较于JS而言,TS拥有了静态类型,更加严格的语法,更强大的功能;TS可以在代码执行前就完成代码的检查,减小了运行时异常的出现的几率;TS代码可以编译为任意版本的JS代码,可有效解决不同JS运行环境的兼容问题;同样的功能,TS的代码量要大于JS,但由于TS的代码结构更加清晰,变量类型更加明确,在后期代码的维护中TS却远远胜于JS。

1、TypeScript 开发环境搭建

  1. 下载Node.js

    • 64位:https://nodejs.org/dist/v14.15.1/node-v14.15.1-x64.msi
    • 32位:https://nodejs.org/dist/v14.15.1/node-v14.15.1-x86.msi
  2. 安装Node.js

  3. 使用npm全局安装typescript

    • 进入命令行
    • 输入:npm i -g typescript
  4. 创建一个ts文件

  5. 使用tsc对ts文件进行编译

    • 进入命令行

    • 进入ts文件所在目录

    • 执行命令:tsc xxx.ts

2、基本类型

  • 类型声明

    • 类型声明是TS非常重要的一个特点

    • 通过类型声明可以指定TS中变量(参数、形参)的类型

    • 指定类型后,当为变量赋值时,TS编译器会自动检查值是否符合类型声明,符合则赋值,否则报错

    • 简而言之,类型声明给变量设置了类型,使得变量只能存储某种类型的值

    • 语法:

        let 变量: 类型;
        
        let 变量: 类型 =;
        
        function fn(参数: 类型, 参数: 类型): 类型{
            ...
        }
      
  • 自动类型判断

    • TS拥有自动的类型判断机制
    • 当对变量的声明和赋值是同时进行的,TS编译器会自动判断变量的类型
    • 所以如果你的变量的声明和赋值时同时进行的,可以省略掉类型声明
  • 类型:

    类型例子描述
    number1, -33, 2.5任意数字
    string‘hi’, “hi”, `hi`任意字符串
    booleantrue、false布尔值true或false
    字面量其本身限制变量的值就是该字面量的值
    any*任意类型
    unknown*类型安全的any
    void空值(undefined)没有值(或undefined)
    never没有值不能是任何值
    object{name:‘孙悟空’}任意的JS对象
    array[1,2,3]任意JS数组
    tuple[4,5]元素,TS新增类型,固定长度数组
    enumenum{A, B}枚举,TS中新增类型
  • number

    • let decimal: number = 6;
      let hex: number = 0xf00d;
      let binary: number = 0b1010;
      let octal: number = 0o744;
      let big: bigint = 100n;
      
  • boolean

    let isDone: boolean = false;
  • string

    • let color: string = "blue";
      color = 'red';
      
      let fullName: string = `Bob Bobbington`;
      let age: number = 37;
      let sentence: string = `Hello, my name is ${fullName}.
      
      I'll be ${age + 1} years old next month.`;
      
  • 字面量

    • 也可以使用字面量去指定变量的类型,通过字面量可以确定变量的取值范围

    • let color: 'red' | 'blue' | 'black';
      let num: 1 | 2 | 3 | 4 | 5;
      
  • any

    • let d: any = 4;
      d = 'hello';
      d = true;
      
  • unknown

    • let notSure: unknown = 4;
      notSure = 'hello';
      
  • void

    • let unusable: void = undefined;
      
  • never

    • function error(message: string): never {
        throw new Error(message);
      }
      
  • object(没啥用)

    • let obj: object = {};
      
  • array

    • let list: number[] = [1, 2, 3];
      let list: Array<number> = [1, 2, 3];
      
  • tuple

      let x: [string, number];
      x = ["hello", 10]; 
    
  • enum

     enum Color {
       Red,
       Green,
       Blue,
     }
     let c: Color = Color.Green;
     
     enum Color {
       Red = 1,
       Green,
       Blue,
     }
     let c: Color = Color.Green;
     
     enum Color {
       Red = 1,
       Green = 2,
       Blue = 4,
     }
     let c: Color = Color.Green;
    
  • 类型断言

    • 有些情况下,变量的类型对于我们来说是很明确,但是TS编译器却并不清楚,此时,可以通过类型断言来告诉编译器变量的类型,断言有两种形式:

      • 第一种

        • let someValue: unknown = "this is a string";
          let strLength: number = (someValue as string).length;
          
      • 第二种

        • let someValue: unknown = "this is a string";
          let strLength: number = (<string>someValue).length;
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值