不需要指定变量(函数的返回值)类型,ts会自动推断出一个类型
基础类型推断 从右向左的推断
比如一个变量定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查
最佳通用类型推断 从右向左的推断
需要从几个表达式中推断类型时候,会使用这些表达式的类型来推断出一个最合适的通用类型
上下文类型推断 从左向右的推断
通常发生在事件处理中
ts
//根据左侧的时间属性推断右侧event的类型
window.onkeydown = function(event) {
console.log(event.clientX) //error
}
开发人员通过类型断言的方式告诉编译器元素类型
ts// 类型断言
let str1:any="this is a string"
let str1num:number=(<string>str1).length
console.log(str1num)
尖括号写法会与JSX冲突,react中只有as语法断言是被允许的
ts//定义一个接口作为类型 其中包含name属性
interface userInfoInterface {
name:string
}
//类型断言
//let userInfo = {} as userInfoInterface
//userInfo.name = "xiao"
/*
不推荐上述写法,在上述写法中若userInfo.name未赋值,TS也不会报错
*/
let userInfo:userInfoInterface = {
name:"小明"
}
没有任何根据的类型断言会造成安全隐患
在上下文中当类型检查器无法断定类型时,一个新的后缀表达式操作符!可以用于断言操作对象是非null和非undefined类型
编译后可能还会出现undefined类型
在实例属性和变量声明后面放置一个 ! 号,从而告诉TS该属性会被明确地赋值
所有通过let或var定义的变量、函数的形参、对象的非只读属性,如果满足指定了初始值且未显式添加类型注解的条件,那么它们推断出来的类型就是指定的初始值字面量类型拓宽后的类型
ts
let str = 'this is string'; // 类型是 string
let strFun = (str = 'this is string') => str; // 类型是 (str?: string) => string;
const specifiedStr = 'this is string'; // 类型是 'this is string'
let str2 = specifiedStr; // 类型是 'string'
let strFun2 = (str = specifiedStr) => str; // 类型是 (str?: string) => string;
通过let、var 定义的变量如果满足未显式声明类型注解且被赋予了null或undefined值,则推断出这些变量的类型是any
在TS中,可以通过某些操作将变量的类型由一个较为宽泛的集合缩小到相对较小、较明确的集合
本文作者:RKLS
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!