类型推断

指不需要指定变量的类型,TS编译器可以根据某些规则自动推断出类型。

什么时候会有类型推断?

  • 声明变量时没有指定类型
  • 函数默认参数
  • 函数返回值
  • ......
let a; // 这时自动推断为any类型
let b = 1; // 推断为number类型
let c = []; // 推断为由any类型构成的数组
let d = (x=1) => x+1; // 函数传参时,默认参数被推断成number类型,返回值也会被推断
let e = [1,null]; // 推断出兼容所有数据的类型:number和null的联合类型有时候TS类型推断不符合我们的预期,我们应该比编译器更有信心它应该是什么类型,类型断言就允许我们覆盖TS的推论。
interface Foo{bar: number
}
let foo: Foo = {} as Foo; // 如果一个对象按照接口的约定,需要有很多的属性和方法,难以在声明的时候定义完全。这时候可以用断言
foo.bar = 1; // 具体的定义在这里

注意:类型断言不能乱用,要对上下文环境有充足的预判,没有任何根据的断言会带来安全隐患!

类型兼容

TS允许类型相互兼容的变量(函数、类等结构)相互赋值。

当一个类型Y可以被赋值给另一个类型X时,就认为类型X兼容Y,X为目标类型,Y为源类型。

兼容规则:

  • 结构之间兼容:成员少的兼容成员多的
  • 函数之间兼容:参数多的兼容参数少的

接口兼容性

interface X {a: any;b: any;
}
interface Y {a: any;b: any;c: any;
}
let x: X = {a:1,b:2};
let y: Y = {a:1,b:2,c:3};
x = y; // x兼容y 成员少的会兼容成员多的

函数兼容性

// 参数个数的兼容
type Handler = (a: number,b: number) => void;
function hof(handler: Handler) {return handler
}
let handler1 = (a:number) => {};
hof(handler1); // 一个参数可以兼容
let handler2 = (a: number,b: number,c: number) => {};
// hof(handler2); // 三个参数不被兼容// 可选参数和剩余参数的兼容
let a1 = (p1: number, p2: number) => {};
let b1 = (p1?: number, p2?: number) => {};
let c1 = (...args: number[]) => {};
a1 = b1;
a1 = c1;
// b1 = a1; // 可选参数不能被兼容。需要将tsconfig.json中“strictFunctionTypes”置为false即可
// b1 = c1;
c1 = a1;
c1 = b1;

类的兼容性

两个定义不同的类互不兼容,子类在继承父类后没有做改动,可以兼容父类。

泛型的兼容性

两个定义完全一样的泛型函数相互兼容

类型保护

TypeScript能够在特定的区块中保证变量属于某种确定的类型。可以在此区块中放心地访问此类型的属性和方法。

比如,我们要判断一个对象是否含有某个方法

interface OBJ {name: string,age: number,sex: boolean
}
let obj: OBJ = {name: "typescript",age: 10,sex: true,
};
if(obj.sex) // obj中有sex属性,所以OK
{console.log("has sex");
}
// if(obj.bac) {}  // obj中没有bac属性,此处报错。

我们有四种提供类型保护的方式:

  • instanceof    用于判断一个实例是否属于某个类
  • in    判断一个属性/方法是否属于某个对象
  • typeof    用于判断基本类型
  • 类型保护函数    当判断逻辑复杂时,可以自定义判断函数
class Java {helloJava(){console.log("hello java");}java: any;
}
class JavaScript {hellloJavaScript(){console.log("hello javascript");}javascript: any;
}// 类型保护函数  注意参数类型 和 返回值类型 的关系
function isJava(lang: Java|JavaScript):lang is Java {return (lang as Java).helloJava !== undefined
}function getLanguage(type: number,x: string|number|boolean) {let lang = type === 1 ? new Java() : new JavaScript();// instanceof 判断lang是否属于Java类if(lang instanceof Java){lang.helloJava(); // 在这个区块中,能够保证lang一定是java的实例,调用自己的方法}else{lang.hellloJavaScript(); // 这个区块中,一定能够保证lang是JavaScript的实例}// in “helloJava”方法是否属于lang对象if("helloJava" in lang){lang.java; // 在这个区块中能够保证,lang是java的实例}else{lang.javascript // 这个区块中能够保证lang是JavaScript的实例}// typeof 用于判断基本类型if(typeof x === "string"){x.length // 程序进入这个区块,能够保证x是string类型。可以调用字符串原生方法}else if(typeof x === "number"){x.toFixed(2); // 在这里能够调用数字的原生方法}else{x = !x;}// 类型保护函数 在定义的时候,注意返回值的类型和参数类型的关系if(isJava(lang)){lang.helloJava();}else{lang.hellloJavaScript();}
}
getLanguage(2,"str");

转载于:https://www.cnblogs.com/V587Chinese/p/11474686.html

TypeScript类型检查机制相关推荐

  1. 浅谈 TypeScript【上】-- Flow 静态类型检查工具

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在[编程语言分类]中,我介绍到JavaScript是一种类型不安全语言,没有明确的数据类型声明,变量的类型可以随意的更改.为了解决这种问题,微软开发 ...

  2. 【TS】1552- 浅谈TS运行时类型检查

    What-什么是运行时类型检查? 编译时类型检查(静态类型检查): 在编译阶段对变量类型进行静态检查,编译后的代码不保留任何类型标注信息,对实际代码运行没有影响 运行时类型检查(动态类型检查): 在代 ...

  3. sql编辑器_SQL的弱点(3):缺少静态类型检查

    静态类型检查的重要 如果要把SQL按照编程语言的类型来分类的话,SQL应该属于一种描述型的动态语言. 用动态语言编写的程序,当达到一定的复杂度后,相比强类型静态编译语言来说,更容易出问题. 从2个例子 ...

  4. linux 内核可装载模块 版本检查机制

    为保持 Linux 内核的稳定与可持续发展,内核在发展过程中引进了可装载模块这一特性.内核可装载模块就是可在内核运行时加载到内核的一组代码.通常 , 我们会在两个版本不同的内核上装载同一模块失败,即使 ...

  5. python参数类型检查_Python中的类型检查

    本文中所有代码均运行在Python 2.7上 为什么要进行类型检查? 总所周知,Python是一门典型的动态语言,在变量定义.使用的过程中遵循duck typing,当对某一变量进行操作时才去检查它是 ...

  6. Flow - JS静态类型检查工具

    本章的目标是提供一些Flow工具的介绍与使用建议.Flow本质上也只是个检查工具,它并不会自动修正代码中的错误,也不会强制说你没按照它的警告消息修正,就不会让你运行程序.当然,并没有要求什么时候一定要 ...

  7. 刚刚开源的Python静态类型检查器:Pyright

    近日,开发者msfterictraut在GitHub上提交了一个名为Pyrignt的开源项目,这是一个Python的静态类型检查器,主要是为了解决mypy等现有的Python类型检查器无法解决的问题. ...

  8. 介绍一款python类型检查工具pyright

    介绍 近日,微软在 Github 上开源了一个 Python 静态类型检查工具:pyright ,引起了社区内的多方关注. 微软在开源项目上的参与力度是越来越大了,不说收购 Github 这种大的战略 ...

  9. Spring Cloud Alibaba Nacos 的 2 种健康检查机制!

    作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注 ...

最新文章

  1. mysql5.7文本编辑器_Windows下mysql-5.7.28下载、安装、配置教程
  2. 编写程序,子进程通过管道向父进程发出字符串ok.
  3. 机器学习(一) 基于sklearn库的数据集划分(交叉验证)
  4. 紫书的训练计划——一点点来,坚持到底!
  5. mysql 备份 php_PHP备份/还原MySQL数据库的代码
  6. 飞鸽传书(http://www.freeeim.com)软件下载
  7. person p = new person();_Python函数__new__及__init__作用及区别解析
  8. Box2DWeb_03之Shape
  9. WEB 端批量移动设备管理控制工具 STF 的环境搭建和运行
  10. 数据结构上机实践第八周项目5 - 计数的模式匹配
  11. 百度要革自己的命?移动搜索或取消PC网页收录
  12. easyui-combobox之setText与setValue先后之分
  13. 计算机高中会考inpute,高中信息技术会考知识点
  14. 购买vSphere虚拟化主机的配置建议清单
  15. java.io.UTFDataFormatException: encoded string too long: 270976 bytes
  16. 【Python自然语言处理】文本向量化的六种常见模型讲解(独热编码、词袋模型、词频-逆文档频率模型、N元模型、单词-向量模型、文档-向量模型)
  17. 微程序控制计算机的工作原理,微程序控制器的基本原理详细图解
  18. 云服务器1M带宽够用吗?(并发数计算方法)
  19. 金山小火车【转自官网】(如果错误,请留言)
  20. CEX暴雷怎么办 一文读懂加密钱包产业现状

热门文章

  1. java 自定义类加载器_Java-JVM 自定义类加载器
  2. android程序启动动画,Android设置软件启动动画(以及初次安装的几张引导图)
  3. [蓝桥杯][算法提高VIP]数的划分(记忆化搜索)
  4. 1191. K 次串联后最大子数组之和(最大子段和变形)
  5. 热狗树 树形dp(中国石油大学我要变强第九场)
  6. 公共钥匙盒(排序CCF)
  7. java alder32_Java里面计算Adler32校验
  8. linux下oracle 9204 soft only,linux 下oracle 9i的安装
  9. 【sklearn学习】数据预处理和特征工程
  10. hive配置遇到的问题( Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D)