TypeScript——类型检查机制

类型检查机制:TypeScript编译器在做类型检查时,所秉承的一些原则,以及表现出的一些行为。

作用:辅助开发,提高开发效率。

类型推断

:指不需要指定变量的类型(函数的返回值类型),TypeScript可以根据某些规则自行的推断出一个类型

1.基础类型推断
2.最佳通用类型推断
3.上下文类型推断

- 前两者都是从右往左的推断,根据值去推断, 例如 let a = 1 // a 被推断的类型是 number

let a = 1

- 最佳通用类型推断 例如 let b = [1, ‘a‘] // b 的最佳通用类型 (string | number)[]

let b = [1, ‘a‘]
let c = (x = 1) => x + ‘2‘ // function(x: number): string

- 根据上下类型推断 例如 window.onkeydown = (event) => {} // 推断 event 为 KeyboardEvent

window.onkeydown = (event) => {
    console.log(event)
}

关于类型断言

interface Foo {
    bar: number
}
let foo = {} as Foo
foo.bar = 1
/**
 * 以上使用`as`的方式,不会提示是否缺失定义`bar`属性,
 * 最好的方式是使用下面代码,在定义时就指明类型
 *
 * Property ‘bar‘ is missing in type ‘{}‘ but required in type ‘Foo‘.
 */

let foo02 : Foo = {
    bar: 1
}

类型兼容性:(当一个类型Y可以被赋值给另一个类型X时,可以说类型X兼容类型Y) =》X(目标类型)=Y(源类型)

  • 口诀

结构之间兼容:成员少的兼容成员多的

函数之间兼容:参数多的兼容参数少的

  • 接口兼容性:成员少 兼容 成员多的(前提:源类型具备目标类型的必要属性 则可以向其兼容)
interface X {
    a: number;
    b: number;
}
interface Y {
    a: number;
    b: number;
    c: number;
}
let xx: X = { a: 1, b: 2}
let yy: Y = { a: 1, b: 2, c: 3 }
// yy = xx // Property ‘c‘ is missing in type ‘X‘ but required in type ‘Y‘
xx = yy // Ok
  • 函数兼容性
type Handler = (a: number, b: number) => void
function hof(handler: Handler) {
    return handler
}
// 1.参数个数
let handler1 = (a: number) => {}
hof(handler1)
let handler2 = (a: number, b: number, c: number) => {}
// hof(handler2) // 源函数参数3个 而目标函数参数2个 所以不能达到兼容

// 可选参数和剩余参数
let a1 = (p1: number, p2: number) => {}
let b1 = (p1?: number, p2?: number) => {}
let c1 = (...arg: number[]) => {}
// 固定参数可兼容可选/剩余
// a1 = b1
// a1 = c1
// 可选参数不可兼容固定/剩余 改变"strictFunctionTypes"为 false可进行兼容
// b1 = a1
// b1 = c1
// 剩余参数可兼容可选/固定
c1 = a1
c1 = b1

// 2.参数类型
// 简单类型
let handler3 = (a: string) => {}
// hof(handler3) // 类型不兼容

// 复杂类型(对象)
interface Point3D {
    x: number;
    y: number;
    z: number;
}
interface Point2D {
    x: number;
    y: number;
}
let p3d = (point: Point3D) => {};
let p2d = (point: Point2D) => {};
p3d = p2d
// p2d = p3d // 成员多 兼容 成员多少的 改变"strictFunctionTypes"为 false可进行兼容

/* 3.返回值类型 Ts要求函数定理类型与返回值类型相同或为其子类型
 * 少的可以兼容多的
*/
let f1 = () => ({ name: ‘jessiex‘ })
let f2 = () => ({ name: ‘jessiex‘, age: ‘2‘ })
f1 = f2
// f2 = f1 // 无法兼容
  • 枚举类型
enum Fruit { Apple, Banana }
enum Color { Red, Yellow }
let fruit: Fruit.Apple = 3
let no: number = Fruit.Apple // 枚举与number之间是相互兼容的
// let color: Color.Red = Fruit.Apple // 枚举之间相互不兼容
  • 类类型
// 比较两个类是否兼容时,静态成员和构造函数是不参与比较的
class A {
    constructor(p: number,q:number) {}
    id: number = 1
    private name: string = ‘‘
}
class B {
    static s =1
    constructor(p: number) {}
    id: number = 2
}
let aa = new A(1,2)
// let bb = new B(1)
// aa = bb OK
// bb = aa OK
// 在拥有私有成员时,只有父类和子类之间相互兼容
class C extends A {}
let cc = new C(1,2)
cc = aa // (aa=bb)Fail
aa = cc // (bb=bb)Fail 

类型保护

指TS能够在特定的区块中保证变量属于某种确定的类型。可以再次区块中放心的引用此类型的属性,或者调用此类型的方法

enum Type { Strong, Weak }
class Java {
    helloJava() {
        console.log(‘hello,Java‘)
    }
    java: any;
}
class JavaScript {
    helloJavaScript() {
        console.log(‘hello,JavaScript‘)
    }
    js: any;
}
function isJava(lang: Java|JavaScript): lang is Java {
    return (lang as Java).helloJava !== undefined
}
function getLanguage(type: Type, x: string | number) {
    let lang = type === Type.Strong ? new Java() : new JavaScript();
    // 1.instanceof 通过判断一个实例是否属于某个类
    if (lang instanceof Java) {
        lang.helloJava()
    } else {
        lang.helloJavaScript()
    }
    // 2.in 通过判断一个属性是否属于某个对象
    if (‘java‘ in lang) {
        lang.helloJava()
    } else {
        lang.helloJavaScript()
    }
    // 3.typeof 通过判断一个变量的类型(借助变量x示范)
    if (typeof x === ‘string‘) {
        console.log(x.length)
    } else {
        x.toFixed(2)
    }
    // 4.类型保护函数:某些判断可能不是一条语句能够搞定的,需要更多复杂的逻辑,适合封装到一个函数内
    if (isJava(lang)) {
        lang.helloJava()
    } else {
        lang.helloJavaScript()
    }
    return lang;
}

原文地址:https://www.cnblogs.com/JessieXie/p/12384960.html

时间: 2024-08-02 05:59:10

TypeScript——类型检查机制的相关文章

TypeScript类型检查机制

类型推断 指不需要指定变量的类型,TS编译器可以根据某些规则自动推断出类型. 什么时候会有类型推断? 声明变量时没有指定类型 函数默认参数 函数返回值 ...... let a; // 这时自动推断为any类型 let b = 1; // 推断为number类型 let c = []; // 推断为由any类型构成的数组 let d = (x=1) => x+1; // 函数传参时,默认参数被推断成number类型,返回值也会被推断 let e = [1,null]; // 推断出兼容所有数据的

React Native之属性类型检查机制详解 PropType 变成 prop-types

属性确认的作用 使用 React Native 创建的组件是可以复用的,所以我们开发的组件可能会给项目组其他同事使用.但别人可能对这个组件不熟悉,常常会忘记使用某些属性,或者某些属性传递的数据类型有误. 因此我们可以在开发 React Native 自定义组件时,可以通过属性确认来声明这个组件需要哪些属性.这样,如果在调用这个自定义组件时没有提供相应的属性,则会在手机与调试工具中弹出警告信息,告知开发者该组件需要哪些属性. React Native已经升级到0.51.0了,版本升级很快,但是对老

Java 笔记(四) RTTI - 运行时类型检查

运行时类型检查,即Run-time Type Identification.这是Java语言里一个很强大的机制,那么它到底给我们的程序带来了什么样的好处呢? 在了解运行时类型检查之前,我们要首先知道另一个密切相关的概念,即运行时类型信息(Run-time Information - 也可以缩写为RTTI) 运行时类型信息使得你可以在程序运行时发现和使用类型信息. 来自:<Thinking in Java>. OK,那么我们总结来说,RTTI就是能够让我们在程序的运行时去获取类型的信息.接下来我

TypeScript 类型推导及类型兼容性

类型推导就是在没有明确指出类型的地方,TypeScript编译器会自己去推测出当前变量的类型. 例如下面的例子: let a = 1; 我们并没有明确指明a的类型,所以编译器通过结果反向推断变量a的类型为number,这种推断发生在初始化变量和成员,设置默认参数值和函数有返回值时. 大多数情况下,类型推导是直截了当的,但也有很复杂的情况,例如需要去匹配参数来推测类型. 最佳通用类型 当需要从几个表达式中推断类型时候,会使用这些表达式的类型来推断出一个最合适的通用类型.例如, let x = [0

解析 Linux 内核可装载模块的版本检查机制

转自:http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/ 为保持 Linux 内核的稳定与可持续发展,内核在发展过程中引进了可装载模块这一特性.内核可装载模块就是可在内核运行时加载到内核的一组代码.通常 , 我们会在两个版本不同的内核上装载同一模块失败,即使是在两个相邻的补丁级(Patch Level)版本上.这是因为内核在引入可装载模块的同时,对模块采取了版本信息校验.这是一个与模块代码无关,却与内核相连的机制.该校验机

Java代码安全性的检查机制

Java代码安全性检查机制: 首先由类装载器(class loader)负责把类文件(.class文件)加载到Java虚拟机(JVM)中,它通过区分本地文件系统的类和网络系统导入的类增加安全性,这可以限制任何特洛伊木马程序.因为本机类总是先被加载,一旦所有的类都被加载完,执行文件的内存就固定了. 然后,字节码校验器进行校验,字节码校验器不检查那些可信任的编译器所生成的类文件,而是对那些有意违背命名空间规定和java语言规则的类文件进行检查,并且关闭具有安全性漏洞的类文件,自己码校验器主要执行下面

javascript:对象类型检查

我们知道,javascript是一种弱类型的语言,并且,javascript中的一切实质上都是对象.那么,在javascript中如何进行对象的类型检查将是一个非常重要的话题. 这里,我将介绍两种在js中经常使用的用于类型检测的方法. 第一种方法是使用"typeof"操作符,这种方法可能大家都知道.使用它来进行类型检测的结果是下列六个字符串中的其中一个:"number","boolean","object","num

一文读懂架构师都不知道的isinstance检查机制

起步 通过内建方法 isinstance(object, classinfo) 可以判断一个对象是否是某个类的实例.但你是否想过关于鸭子协议的对象是如何进行判断的呢? 比如 list 类的父类是继 object 类的,但通过 isinstance([], typing.Iterable) 返回的却是真,难道 list 是可迭代的子类? 根据 PEP 3119 的描述中得知实例的检查是允许重载的: The primary mechanism proposed here is to allow ov

redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换

原文:redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换 一.  概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1   类型检查与命令多态 redis中用于操作键的命令基本上可以分为两种类型,一种是可以对任何的键执行,如:del, expire,rename,type,object 这些命令等,对于这些命令属于多态命令.另一种命令