TypeScript 之 类型推断 类型兼容 类型保护
2019-10-11 本文已影响0人
_一九九一_
类型推断
- ts会自动推断写的代码是什么类型
- 当你不需要ts自动推断类型的时候 需要用到类型断言
- 最佳通过类型推断
- 上下文类型推断
// 断言为number
let a = 1;
// 断言为number[]
let b = [1,2]
interface Foo{
bar: number
}
let foo = {} as Foo // 增加了Foo就不会报错 类型断言
foo.bar = 1 // 空对象没有bar 会报错
//但是常用直接指定类型 不建议用as断言方式
let foo: Foo = {
bar: 1
}
类型兼容性问题
- 当一个类型Y可以被赋值给另外一个类型X时,我们就可以说类型X兼容类型Y
- 结构之间兼容,成员少的兼容成员多的
- 函数之间兼容,参数多的兼容参数少的
类型保护
- 能够在特定的区块中保证变量属于某种确定的类型
- 可以在此区块中放心的引用此类型的属性,或者调用此类型的方法
enum Type { Strong, Week }
class Java{
helloJava(){
console.log('java')
}
java:any
}
class JavaScript {
helloJavaScript(){
console.log('JavaScript')
}
javascript: any
}
function isJava(lang: Java | JavaScript): lang is Java{
return (lang as Java).helloJava !== undefined
}
function getLanguage(type: Type, x: sting | number){
let lang = type = Type.Strong ? new java() : new JavaScript()
// 方式一:
if( lang instanceof Java){
lang.helloJava()
}else{
lang.helloJavaScript()
}
// 方式二:class里面添加属性
if('java' in lang){
lang.helloJava()
}else{
lang.helloJavaScript()
}
// 方式三:
if(typeof x === 'string'){
x.leng
}else{
x.toFixed(2)
}
//方式四: 创建一个类型保护函数判断对象类型
if(isJava(lang)){
lang.helloJava()
}else{
lang.helloJavaScript()
}
return lang
}
getLanguage(Type.Strong)