TypeScript 初识 - 变量

类型注解

类型注解使用 :TypeAnnotation 语法。类型声明空间中可用的任何内容都可以用作类型注解。

const num: number = 123;
function identity(num: number): number {
    return num;
}

基础类型

TypeScript 支持原生 JavaScript 所有的基础数据类型:

  • undefined
  • null
  • string
  • number
  • boolean
  • symbol(ES6)

也支持引用数据类型:

  • Object
  • Array
  • Map
  • Set

TypeScript 还扩展一些数据类型:

元组 tuple

元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。

const tuple: [string, number] = ['string', 123];
// tuple[0] 只能指定 string 类型,tuple[1] 只能指定 number 类型

其实元组可以看作是一个严格的数组,规定了指定索引位置的元素类型,还限制了数组的长度(v2.7,官方中文文档未更新)。

任意类型 any

其他类型都是 any 类型的子类型,any 类型的值可以被赋值为除 never 类型外的任何类型的值:

let an: any = 'any 类型';
console.log(an);
// any 类型
an = 25;
console.log(an);
// 25

如果在声明变量时,没有声明其类型,也没有初始化,(因为类型推断会自动判断类型),那么它就会被判断为 any 类型:

let an1;
an1 = '没有声明其类型,也没有初始化';
console.log(an1);
// 没有声明其类型,也没有初始化
an1 = 25;
console.log(an1);
// 25

any 类型可以看作是一个动态类型,类型检查器直接让这些 any 类型的变量通过编译阶段的检查。

any 类型的变量可以调用任意的方法,这和 JavaScript 中常规定义的变量相同,但是运行时如果没有这些方法仍然会报错:

let something: any = 42;
// 可以通过编译,但是运行时没有这个方法时候报错的
something.mayExist();
// 可以通过编译,运行也不会报错
something.toFixed();

无类型 void

void 可以看作和 any 相反的类型,void 表示没有任何类型。通常会定义为函数的返回值:

function info(): void {
  console.log('this is info!');
}

一个 void 类型的变量是没有生命用处的,因为 void 类型的变量只能赋值为 undefinednull

不存在的值 never

never 类型表示永不存在的值。never 类型是 TypeScript 中的最底层类型:

  • 一个从来不会有返回值的函数;
  • 一个总是会抛出错误的函数;

never 类型是任何类型的子类型,也可以赋值给任何类型,但是 never 仅能被赋值给另外一个 never 类型。

nevervoid 有一些区别的,函数没有返回值时:

  • 返回类型为 void 的方法,即使没有写明 return x 语句,也会在函数执行完的时候,隐式地返回一个 void 类型。
  • 返回类型为 never 的方法,完全不可能执行 return 语句,换句话说这个方法执行不完,真真正正的不返回。

正则表达式类型 regexp

//构造函数声明法
let reg1: RegExp = new RegExp('ljy', 'gi');
console.log(reg1);

//字面量的声明法
let reg2: RegExp = /ljy/gi;
console.log(reg2);

枚举 enum

类型断言

TypeScript 也不是万能的,对变量类型的解析也是会出错,这个时候就需要类型断言。

  1. “尖括号”语法:
const someValue: any = 'this is a string';
const strLength: number = (<string>someValue).length;
  1. as 语法:
const someValue: any = 'this is a string';
const strLength: number = (someValue as string).length;

类型断言不是类型转换,断言成一个联合类型中不存在的类型时不允许的:

function toBoolean(something: string | number): boolean {
    // Type 'string | number' cannot be converted to type 'boolean'
    return <boolean>something;
}

变量声明

var

尽量避免使用 var 声明变量。

let

ES6 中新增加的变量声明方式。和 var 相似,但是更容易理解。

const

ES6 中新增加的变量声明方式。和 let 相似,但是不允许修改。

使用最小特权原则,所有变量声明方式第一选择为 const,只有在确定需要修改变量时,才需要使用 let 进行声明。

类型别名

类型别名常用于联合类型,可以使用 type 创建类型别名:

type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
function getName(n: NameOrResolver): Name {
    if (typeof n === 'string') {
        return n;
    } else {
        return n();
    }
}
    原文作者:fatedeity
    原文地址: https://segmentfault.com/a/1190000020042993
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞