typescript 基础知识整理

一. 基础类型

Never:

  1. 抛出异常
  2. 无返回值的函数表达式

// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
    throw new Error(message);
}

// 推断的返回值类型为never
function fail() {
    return error("Something failed");
}

// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
    while (true) {
    }
}

void:
通常用于表示函数无返回值

function warnUser(): void {
    console.log("This is my warning message");
}

普通数组类型定义:
number[]

数组泛型:
Array

元祖类型(Tuple):
表示一个已知元素数量和类型的数组

// Declare a tuple type
let x: [string, number];
// Initialize it
x = ['hello', 10]; // OK
// Initialize it incorrectly
x = [10, 'hello']; // Error

枚举类型:
枚举类型提供的一个便利是你可以由枚举的值得到它的名字。 例如我们知道数值,但是不确定它映射到哪个名字,我们可以查找相应的名字

// 默认情况下,从0开始为元素编号; 也可以手动的指定成员的数值 
enum Color {Red, Green, Blue}
let c: Color = Color.Green;

类型断言:没有运行时的影响,只是在编译阶段起作用
通过类型断言可以告诉编译器,我知道当前类型是什么(TypeScript会假设你已经进行了必须的检查)
两种表达形式:

  1. “尖括号”语法

    let someValue: any = "this is a string";
    let strLength: number = (someValue).length;
  2. as语法

    let someValue: any = "this is a string";
    let strLength: number = (someValue as string).length;

其他常见基础类型有:
object: 非原始类型
any: 任何类型
boolean: 布尔值
number: 数字类型
string: 字符串类型
Null 和 Undefined

二. 接口
接口是如何工作的:
类型检查器会查看接口的调用,编译器只会检查那些必需的属性是否存在,并且其类型是否匹配

只读属性:
只能在对象刚刚创建的时候修改其值
(初始化对象值后再进行赋值会报错error)

interface Point {
    readonly x: number;
    readonly y: number;
}

TypeScript具有ReadonlyArray类型,确保数组创建后再也不能被修改
**只读属性也不可赋值给其他类型

let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray = a;
a = ro; // error!
// 可用类型断言
a = ro as number[];

函数类型:

// 定义
interface SearchFunc {
  (source: string, subString: string): boolean;
}

函数的参数会逐个进行检查,要求对应位置上的参数类型是兼容的
对于函数类型的类型检查来说,函数的参数名不需要与接口里定义的名字相匹配

// 使用
let mySearch: SearchFunc;
mySearch = function(src: string, sub: string): boolean {
  let result = src.search(sub);
  return result > -1;
}

索引类型:
暂无

三. 泛型
使用 类型变量T(泛型参数名可以使用任意名) 表示泛型

// T帮助我们捕获用户传入的类型以及返回类型
function identity(arg: T): T {
    return arg;
}

可以用两种方法使用:

  1. 传入所有的参数,包含类型参数

    // 明确的指定了T是string类型,并做为一个参数传给函数,使用了<>
    let output = identity("myString");  // type of output will be 'string'
  2. 利用了类型推论 -- 即编译器会根据传入的参数自动地帮助我们确定T的类型

    // 不使用尖括号(<>)来明确地传入类型, 编译器可以查看myString的值,然后把T设置为它的类型
    let output = identity("myString");  // type of output will be 'string'

    注:如果编译器没有自动地推断出类型,只能明确的传入T的类型

泛型变量:
在函数体必须正确的使用这个通用的类型变量

function loggingIdentity(arg: T): T {
    console.log(arg.length);  // Error: T doesn't have .length
    return arg;
}
// 泛型约束
function loggingIdentity(arg: T[]): T[] {  // T[] 可表示为 Array
    console.log(arg.length);  // Array has a .length, so no more error
    return arg;
}

定义泛型接口:

interface GenericIdentityFn {
    (arg: T): T;
}
function identity(arg: T): T {
    return arg;
}
let myIdentity: GenericIdentityFn = identity;
// 明确泛型类型
let myIdentity: GenericIdentityFn = identity;

泛型类:

class GenericNumber {
    zeroValue: T;
    add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

泛型约束:
需要列出对于T的约束要求, 定义一个接口来描述约束条件

interface Lengthwise {
    length: number;
}

function loggingIdentity(arg: T): T {
    console.log(arg.length);  // Now we know it has a .length property, so no more error
    return arg;
}

你可能感兴趣的:(前端typescript)