美文网首页
【TS DOC】类型

【TS DOC】类型

作者: 大Q本Q | 来源:发表于2019-06-25 17:32 被阅读0次

使用方式

let is_valid:boolean
is_valid = ture;    // 正确使用
is_valid = 'abc';   // 报错,因为is_valid指定布尔型,但'abc'是字符串类型

所有类型

布尔

let is_valid:boolean = true;

数字 1. 所有数字都是浮点数;2.支持10进制,16进制,2进制,8进制

let age:number = 18;

字符串

let name:string = 'WJ';
let name :string = 'My name is ' + user.name;
let name:string = `My name is ${user.name}`;

数组 number[]; Array<number>;

let list:number[] = [1,2,3]
let list:Array<object> = [ {id:1}, {id:2} ]; 

只读数组ReadonlyArray<number>创建不能修改

let list:ReadonlyArray<number> = [3,5,2];  
let list2 : number[];
list[0] = 4;               // 错误
list2 = list;              // 错误
list2 = list as number[];  // 正确:利用断言as重写

对象非原生类型,无法像其他类型一样声明类型

let obj:any = {}
let {a,b}:{a:number, b:string} = {a:18, b:'WJ'}

函数 非原生类型

let func:()=>void;

元祖 特殊数组:固定长度与每个元素类型

let tuple:[string, number] = ['WJ',18];            // 正确
let tuple:[string, number] = [false,18];           // 错误,类型不一致
let tuple:[string, number] = ['WJ',18,'female'];   // 错误,长度不一致
let tuple:[string, number] = ['WJ'];               // 错误,长度不一致

枚举

// 定义枚举: enum 枚举名 { 字符串名=编号 }
enum Color1 {Red, Green, Blue};
enum Color2 {Red, Green=3, Blue, Yellow=8};  // 手动指定编号,编号3前以0开始计算,编号3后,从编号3开始计算
enum Color3 {Red='#FF0000', Green='00FF00', Blue='0000FF' };

// 获取枚举值的编号
Color1.Green;    // 输出1; 编号从0开始计算
Color2.Green;    // 输出3; 
Color3.Green;    // 输出#00FF00

// 获取枚举值的字符串名
Color1[1];       // 输出'Red'

Any 允许任何类型

let data:any = 'WJ'  // 声明Any类型
data = 18;           // 正确
data = false;        // 正确
data.getList();      // 正确;编译时不会坚持getList是否存在,但是运行时因为不存在getList而报错

Void用来强制函数返回null或undefined

// 正确的,getList的return值是undefined
function getList():void{
    console.log(1)
}
// 错误的,因为return的值不是null或undefined
function getList():void{
    return 'abc'
}

Null / Undefined

let u :undefined = undefined;
let n :null = null;

// `不赞成`若不是strictNullChecks模式,null和undefined可复制给任意类型的变量 
let age:number = 18;
let n:null =null;
age = n; // 输出:age===null

Never 表示函数无法正常执行完成,中途必定报错

function err(msg:string):never{ throw new Error(msg); }
function fail(){ return err('some fail'); }
function fn():never{
    while (true){}
}

断言coder自信确认类型,无需ts检查

let fullname = 'WJ'
// 写法一(建议这种写法)
let length:number = (fullname as string).length;
// 写法二(JSX不支持此写法)
let length:number = (<string>fullname).length

泛型

交叉类型

把多种类型叠加成一种类型

let object_1 = {
    name: 'WJ',
    age:18
}
let object_2 = {
    hello:'Hello WJ',
    sayHello(){
        console.log(this.hello)
    }
}

// 将object_1与object_2合并,生成的对象拥有两者的所有类型
function merge_object<T, U>(first: T, second: U): T & U {
    let result = <T&U>{}
    result = {...(object_1 as any), ...object_2}
    return result;
};

// result: {name, age, hello, sayHello}
let result = merge_object(object_1, object_2);
result.sayHello();

联合类型

参数有指定的几种类型

function func(x:number | string) {
    let RESULT_PRE = {
        number:'age is ',
        string:'name is ',
    }
    let type:string = typeof x;
    let result: string = RESULT_PRE[type] ? RESULT_PRE[type] + x : 'who are you';
    return result;
}

func(18);    // 输出: age is 18
func('WJ');  // 输出:name is WJ
func({});    // 输出:who are you

联合类型是接口,只能访问接口中共有部分

interface car {
    buy();
    drive();
}

interface house {
    buy();
    sleep();
}

let x:car | house
x.buy();      // 正确
x.drive();    // 错误
x.sleep();  // 错误

类型保护与区分类型 param_name is type_name

示例

function isNumber(x:any): x is number{
    return typeof x === 'number'
}
function func(x:any){
    let result;
    if(isNumber(x)){
        result = x+1;
    }
    return result;
}

应用


interface car {
    buy();
    drive();
}

interface house {
    buy(),
    sleep();
}


function func(): car | house {
    let result:car;
    result.buy = ()=>{}
    result.drive = ()=>{}
    return result;
}

let tool = func();

// 正确:因为buy是car和house共有
if(tool.buy){
   tool.buy();
}

// 错误:因为drive只属于car,不属于house,tool只能使用共有
if(tool.drive){  
   .drive();
}

// 用来判断当前对象是car
function isCar(x:car | house): x is car {
    return (x as car).drive !== undefined
}
// 正确
if(isCar(tool)){
    tool.drive();
}

类型别名

type name = string;
type name_creator = ()=>string;
type name_type = name | name_creator

function getName( n: name_type): name{
    return typeof n === "string" ? n : n();
}

泛型别名

type as_name<T> = {x:T}
type as_name<T> = {
    x: T;
    y:as_name<T>
}

多态的this类型

通过return this,实现链式调用

class PERSON {
    constructor(public name:string){}

    getName(){return this.name;}

    setName(name){
        this.name = name;
        return this;
    }
}

let wj = new PERSON('WJ');
wj.setName('WanJin').getName();  // 因为setName方法return this,所有调用完成后,可接着调用getName

索引类型

// keyof T : 由T的key组成的数组
// T[key] : T的一个属性值
function func<T, K extends keyof T>(array:T, keys:K[]):T[K][] {
    return keys.map(key=>array[key])
}

let person = {
    name:'WJ',
    age:18,
    sex:'male'
}

func(person, ['name','age']);       // ['WJ',18]

映射类型


相关文章

  • 【TS DOC】类型

    使用方式 所有类型 布尔 数字 1. 所有数字都是浮点数;2.支持10进制,16进制,2进制,8进制 字符串 数组...

  • 【TS DOC】接口

    接口作用 描述一个对象的取值规范;通俗的说:规定一个对象有哪些属性,属性的类型是什么 注:下文接口统一取名:my_...

  • 【TS DOC】Symbols

    创建独一无二的值,就算参数相同,返回的Symbol值也是不同的 创建方法Symbol、for、keyFor 内置S...

  • 【TS DOC】模块

    导出 export 导出单文件,推荐用export default 导出方式 引入 import 默认导出引入de...

  • typeScript语法

    ts类型 ts联合类型使用或 ts定义任意类型any ts定义函数返回值的类型 ts中的类定义 interface接口

  • 【TS DOC】泛型

    未知应用场景

  • Ts 进阶使用指南

    # Ts 使用指南 ## 6、参数类型和返回类型 ```ts // 参数类型和返回类型 function crea...

  • TS高级类型:Extract 与 Exclude

    Extract 是TS提供的一个TS高级type类型【简称TS高级类型】 Extract 用于类 Extract ...

  • typescript笔记--类型篇

    动态监听ts文件变动,自动编译js 生成ts配置文件 类型约束的基本语法 ts的类型: 1.number类型:数字...

  • 冰冷的中午

    http://htmlify.wps.cn/doc/index.html?ts=2147483647&ksyun=...

网友评论

      本文标题:【TS DOC】类型

      本文链接:https://www.haomeiwen.com/subject/ravtcctx.html