TypeScript记录

124 阅读3分钟

变量let 和 var

1. 申明

var 变量名: 类型 = 值

let变量不能重复定义
var取最后定义的值

//报错
let x = 1;
let x = 2;

//正常 y = 4
var y = 3;
var y = 4;
  • 在类里面声明变量不能加 varlet ?

2. 作用域

let是函数作用域
var是块级作用域

demo.ts文件

function funLetVar() {
  let nums: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  console.log("\n-----let--------\n");
  for (let i = 0; i < 4; i++) {
    console.log("llll");
    for (let i = 0; i < 2; i++) {
      console.log(`i = ${i}`);
    }
  }
  
  console.log("\n-----var--------\n");
  for (var i = 0; i < 2; i++) {
    console.log("vvvvv", i);
    for (var i = 0; i < 10; i++) {
      console.log(`i = ${i}`);
    }
  }
}
funLetVar()

//打印
-----let--------

llll
i = 0
i = 1
llll
i = 0
i = 1
llll
i = 0
i = 1
llll
i = 0
i = 1

-----var--------

vvvvv 0
i = 0
i = 1
i = 2

执行命令tsc demo.ts编译得到demo.js文件
可以看到let申明的变量i是由2个变量替代了,而var申明的变量i用的就是同一个变量。

deom.js文件

function funLetVar() {
    var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    console.log("\n-----let--------\n");
    for (var i_1 = 0; i_1 < 4; i_1++) {
        console.log("llll");
        for (var i_2 = 0; i_2 < 2; i_2++) {
            console.log("i = " + i_2);
        }
    }
    console.log("\n-----var--------\n");
    for (var i = 0; i < 2; i++) {
        console.log("vvvvv", i);
        for (var i = 0; i < 10; i++) {
            console.log("i = " + i);
        }
    }
}
funLetVar();

类型

1. 基本类型

  let bl: number = 0b10011;
  let name: string = "aa";
  let years: number = 5;
  let words: string = `name is ${name} year is ${years}`;
  console.log(words);
  
  //数组
  let x: number[] = [1, 2.0];
  let x1: Array<number> = [1, 3.3]

  //元祖
  var tuple: [string, number]
  tuple[0] = "jjk" //未整体赋值前不能修改单个下标的值
  tuple = ["a1b2c3", 3456]
  tuple[1] = 123
  console.log(tuple[0], tuple[1]);
  
  //枚举
  enum Color {
    Red,
    Green,
    Blue
  };
  var color = Color.Red
  color = Color.Green
  let c1: Color = Color.Blue


  //方法
  function fun1(str:string):void {
    console.log(str)
  }
  fun1("fun 1");
  
  function fun2(str: string):string {
    return str+" halo"
  }
  let rst = fun2("fun 2")
  console.log(rst);

2. Any 类型

任意值类型可以让这些变量跳过编译阶段的类型检查

function funAny() {
  let x: any = 4
  x = "abc"
  x = true

  let arrayAny: any[] = [12, "a0d", false, [12, "a"]]
  arrayAny[0] = null
  arrayAny[1] = 44
  arrayAny[2] = "a"
  arrayAny[3] = "a";
  console.log(arrayAny);
}
funAny()

3. Null 和 Undefined 类型

null是一个只有一个值的特殊类型,表示一个空对象引用;
undefined 是一个没有设置值的变量;

function funNullUndefined() {
  //变量 x 只能是number类型
  var x: number
  x = 4
  x = null
  x = undefined

  //如果一个类型可能出现 null 或 undefined, 可以用 | 来支持多种类型
  var y: number | null  | undefined
  y = 1
  y = null
  y = undefined

}
funNullUndefined()

4. never 类型

never 是其它类型(包括 nullundefined)的子类型,代表从不会出现的值。这意味着声明为 never 类型的变量只能被 never 类型所赋值,在函数中它通常表现为抛出异常或无法执行到终止点(例如无限循环)。

function funNever() {
  let x: never
  let y = 5

  // x = 44
  y = 14

  //运行正确,never 类型可以赋值给 never类型
  x = (()=>{throw new Error("err msg")})()
  x = (()=>{throw "err msg"})()

  //返回值为 never 的函数可以是无法被执行到的终止点的情况
  function loopFun(): never {
    while (true) {}
  }
  x = loopFun()
}
funNever()

类型断言

类型推断

函数

1. 可变参数...

//x接受第一个值
function funSum(x: number, ...num: number[]): number {
  var rst: number = x;
  console.log(rst);

  for (let index = 0; index < num.length; index++) {
    rst += num[index];
  }

  return rst
}
console.log(funSum(13, 2, 3, 4, 5))