TypeScript类型检查机制
类型推断
指不需要指定变量的类型,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");
TypeScript类型检查机制的更多相关文章
- 细说Typescript类型检查机制
上一篇文章我介绍了Typescript的基础知识,回顾一下,有基础数据类型.数组.函数.类.接口.泛型等,本节内容将述说一下Typescript为方便我们开发提供了一些类型检查机制. 类型检查机制 类 ...
- 【长文详解】TypeScript、Babel、webpack以及IDE对TS的类型检查
只要接触过ts的前端同学都能回答出ts是js超集,它具备静态类型分析,能够根据类型在静态代码的解析过程中对ts代码进行类型检查,从而在保证类型的一致性.那,现在让你对你的webpack项目(其实任意类 ...
- TypeScript 类型推导及类型兼容性
类型推导就是在没有明确指出类型的地方,TypeScript编译器会自己去推测出当前变量的类型. 例如下面的例子: let a = 1; 我们并没有明确指明a的类型,所以编译器通过结果反向推断变量a的类 ...
- 类型检查和鸭子类型 Duck typing in computer programming is an application of the duck test 鸭子测试 鸭子类型 指示编译器将类的类型检查安排在运行时而不是编译时 type checking can be specified to occur at run time rather than compile time.
Go所提供的面向对象功能十分简洁,但却兼具了类型检查和鸭子类型两者的有点,这是何等优秀的设计啊! Duck typing in computer programming is an applicati ...
- CesiumJS新增官方TypeScript类型定义
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 在当前的1.70版本中,CesiumJS现在附带了正式的Type ...
- 解析 Linux 内核可装载模块的版本检查机制
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/ 为保持 Linux 内核的稳定与可持续发展,内核在发展过程中引进了可 ...
- 编译期类型检查 in ClojureScript
前言 话说"动态类型一时爽,代码重构火葬场",虽然有很多不同的意见(请参考),但我们看到势头强劲的TypeScript和Flow.js,也能感知到静态类型在某程度上能帮助我们写出 ...
- 享受Python和PHP动态类型检查语言的快感
前言 写这文章的时候特地查了资料,以确保我没有说错关于Python和PHP的类型机制. 所以这里放一张图,关于强弱类型与动态/静态类型检查的区分 从分类上看,PHP属于弱类型语言,而Python属于强 ...
- 介绍几款 Python 类型检查工具
近日,微软在 Github 上开源了一个 Python 静态类型检查工具:pyright ,引起了社区内的多方关注. 微软在开源项目上的参与力度是越来越大了,不说收购 Github 这种大的战略野心, ...
随机推荐
- 启动zuul时候报错:The bean 'proxyRequestHelper', defined in class path resource [org/springframework/cloud/netflix/zuul
启动zuul时候报错:The bean 'proxyRequestHelper', defined in class path resource [org/springframework/cloud/ ...
- 795. Number of Subarrays with Bounded Maximum
数学的方式 是对于所有的字符分成简单的三类 0 小于 L 1 LR 之间 2 大于R 也就是再求 不包含 2 但是包含1 的子数组个数 不包含2的子数组个数好求 对于连续的相邻的n个 非2类数 就有 ...
- vue 实现邮戳边缘
效果: vue: <template> <div class="couponItem"> <div class="itemLeft" ...
- oracle中utl_file包读写文件操作实例学习
在oracle中utl_file包提供了一些操作文本文件的函数和过程,学习了一下他的基本操作 1.创建directory,并给用户授权 复制代码 代码如下: --创建directory create ...
- Oracle的UTL_FILE.FOPEN学习笔记
Oracle提供的文件操作包UTL_FILE包中的UTL_FILE.FOPEN负责打开一个文件. UTL_FILE.FOPEN(location in varchar2, filename in va ...
- 阿里云 Aliplayer高级功能介绍(七):多分辨率
基本介绍 网络环境比较复杂.网速不稳定,Aliplayer提供了多分辨率播放的模式,用户可以手工切换分辨率和播放器选择最优分辨率,基本UI如下: Source模式 source的方式指定多个清晰度的地 ...
- spring cloud深入学习(八)-----配置中心svn示例和refresh
svn版本 同样先示例server端的代码,基本步骤一样. 1.添加依赖 <dependencies> <dependency> <groupId>org.spri ...
- 解决maven项目创建过慢的问题
关键就在这里:添加以下键值对 archetypeCataloginternal 之后点击Next,再单击Finish即可.
- JDBC1 --- 获取数据库连接的方式一 --- 技术搬运工(尚硅谷)
需要mysql-connector-java-5.1.7-bin.jar @Test public void testConnection1() throws SQLException { Drive ...
- VS2015使用Nuget安装OpenCV3.X以及Python3安装OpenCV3.X
VS2015已经自带Nuget安装工具了,所以,新建一个项目,点击管理Nuget包 搜索OpenCV3 注意,目前只有这个版本支持VS2015,也就是平台工具集可以为vs140,其他的都会报错,报错我 ...