本文内容如下
联合类型,交叉类型,类型断言,类型别名,类型推断的了解与使用
如果你都有了答案,可以忽略本文章,或去TS学习地图寻找更多答案
联合类型
可以简单理解为:或者
常与类型别名结合使用
let title: string | number = 1
与类型别名结合使用
type S = string
type N = number
type F = () => string
const result: S | N | F = 1
const result: S | N | F = ’tao‘
const result: S | N | F = () => 'hello ts'
交叉类型
可以简单理解为:并且
interface A {
name: string
}
interface B {
age: number
}
type Person = A & B
let xiaoming: Person = { name: 'tao', age: 18 }
类型别名 type aliases
定义:先声明,再引用 语法:使用type关键字 + 大写开头 = xx 场景:联合类型
例子1
function sum(x: number, y: number): number {
return x + y
}
没有使用类型别名
const sum2: (x: number, y: number) = sum(1,2)
使用类型别名
type PlusType = (x: number, y: number) => number
const sum2:PlusType = sum(1,2)
例子2:联合类型:想传递字符串或者函数
type NameResolve = () => string
type NameOrResolve = string | NameResolve
function getName(n: NameOrResolve): string {
if (typeof n === 'string') {
return n
}
return n()
}
function fn(str: string): string{
return str.toLocaleUpperCase()
}
console.log(getName('tao'))
console.log(getName(fn('tao')))
类型断言 type assertion
定义:告诉编译器,你比它更了解类型,它不应该再发生错误,也就是该代码在运行时,会得到该结果. 语法:使用 as 场景:联合类型,不知道是什么时
ts拒绝可能,拥抱肯定
写法一:
如果不断言,可能拿不到length,因为有可能传number
function getLength(input:number | string):number{
const str = input as String
if(str.length){
return str.length
}else{
const number as Number
return number.toString().length
}
}
写法二:断言写法二
function getLength(input:number | string):number{
if((<string>input).length){
return (<string>input).length
}else{
return input.toString().length
}
}
类型推断
不写注解,TS会自动帮推断出类型
let x = 123
let x = [0, 1, null]
最佳通用类型
class Animal{
numlegs:number
}
class Bee extends Animal{}
class Lion extends Animal{}
let zoo = [new Bee(), new Loin()]
let zoo: Animal[] = [new Bee(), new Loin()]
命名空间模块
命名空间:
- 单独作用域,避免命名冲突
- 使用关键字namespace
- 内部的类或函数需要暴露出来,export
namespace A{
export class Dog {}
}
namespace B{
export class Dog {}
}
let d = new A.Dog()
let d2 = new B.Dog()
export namespace A{
export class Dog {}
}
学习更多
TS学习地图
|