let 与函数参数等具有隐性 any
noImplicitAny 配置隐性 any 是否报错,推荐开启
any 放弃所有类型检查
unknown 还有类型检查
通过类型断言赋值使用
可以通过 never 进行类型检查报错
declare const strOrNumOrBool: string | number | boolean
if (typeof strOrNumOrBool === 'string') {
// 一定是字符串!
strOrNumOrBool.charAt(1)
} else if (typeof strOrNumOrBool === 'number') {
strOrNumOrBool.toFixed()
} else if (typeof strOrNumOrBool === 'boolean') {
strOrNumOrBool === true
} else {
const _exhaustiveCheck: never = strOrNumOrBool
throw new Error(`Unknown input type: ${_exhaustiveCheck}`)
}
可以在保留类型提示的前提下,不那么完整地实现这个结构
interface IStruct {
foo: string
bar: {
barPropA: string
}
}
const obj: IStruct = {} // 报错
const obj = {} as IStruct //不用每个属性都初始化
先断言到 unknown 类型,再断言到预期类型
any/unkonwn->Object->String/Boolean/Number->原始类型与对象类型->字面量类型->never