自动类型推论
概述
根据初始化进行类型推论
不用明确告诉编译器具体是什么类型,编译器就知道是什么类型 根据初始化值自动推断 注意点: 如果先定义在初始化,那么是无法自动推断 的
let x = [ 0 , 1 , null ]
let uage;
uage = 123
uage = true
上下文类型推断
window. onmousedown = function ( mouseEvent) {
mouseEvent. button
mouseEvent. clientX
}
对象类型兼容性
对象类型兼容性(可多不可少)
interface INameTest {
name: string
}
let n1 = { name: "法外狂徒张三" }
let n2 = { name: "zs" , age: 18 }
let n3 = { age: 19 }
let val: INameTest
val = n1
val = n2
对象类型兼容性(类型必须一一对应)
interface ITestInfo {
name: string
children: {
age: number
}
}
let p1 = { name: 'zs' , children: { age: 19 } }
let p2 = { name: 'zs' , children: { age: true } }
let person: ITestInfo;
person = p1
函数类型兼容性
参数个数
let func1 = ( x: number , b: string ) => { }
let func2 = ( x: number ) => { }
func1 = func2
参数类型
let func3 = ( x: number ) => { }
let func4 = ( x: string ) => { }
let func5 = ( x: number ) => { }
func3 = func5
参数返回值
let func6 = ( ) : number => 23
let func7 = ( ) : number => 13
let func8 = ( ) : string => "返回值类型的兼容性"
func6 = func7
双向协变
let funct1 = ( x: number ) => { }
let funct2 = ( x: ( number | string ) ) => { }
funct1 = funct2
let funct3 = ( x: boolean ) : ( number | string ) => x? 18 : 'zs'
let funct4 = ( x: boolean ) : number => 18
funct3 = funct4
函数重载
function add ( x: number , y: number ) : number
function add ( x: string , y: string ) : string
function add ( x: any , y: any ) : any {
return x+ y
}
function sub ( x: number , y: number ) : number
function sub ( x: any , y: any ) : any {
return x- y
}
let fna = add
let fns = sub
fns = fna
可选参数及剩余参数
function func ( args: any [ ] , callback : ( ... args: any [ ] ) => void ) { }
func ( [ 1 , 2 ] , ( x, y, z) => console . log ( x+ y+ z) )
func ( [ 1 , 2 ] , ( x? , y? ) => console . log ( x+ y) )
func ( [ 1 , 2 ] , ( x, y? , z? ) => console . log ( x+ y) )
枚举类型知识补充
数据枚举类型
数字枚举的取值可以是字面量 ,也可以是常量 ,也可以是计算的结果 如果采用字面量 对第一个成员进行赋值 ,下面的成员会自动递增 如果采用常量 或计算结果 进行赋值,则下面的成员也必须初始化
enum Gender {
Male,
Female
}
console . log ( Gender. Male, Gender. Female)
console . log ( Gender[ 0 ] )
const val = 100
const num = ( ) => 200
enum Gender_1 {
Male = val,
Female = num ( )
}
字符串枚举类型
如果采用字面量 对第一个成员进行赋值,下面的成员也必须赋值 采用[index]的形式不能获取到内容,需要传入[key] 字符串枚举 不能使用常量 或计算结果 给枚举值赋值 它可以使用内部的其他枚举值 来赋值
enum Direction {
up = "UP" ,
down = "DOWN"
}
console . log ( Direction. up)
console . log ( Direction[ "up" ] )
const str = "法外狂徒张三"
const res = ( ) => "鬼脚七"
enum Star{
desc = "太极宗师" ,
tagDesc = desc
}
异构枚举(数字+字符串)
enum Person{
Male = 1 ,
Female = '女'
}
console . log ( Person. Male)
console . log ( Person. Female)
console . log ( Person[ 0 ] )
console . log ( Person[ "Male" ] )
把枚举成员当作类型来使用
enum Gender_2{
Male,
Female
}
interface PersonInfo {
sex: Gender_2
}
class Persons implements PersonInfo {
sex: Gender_2. Female = 1
}
枚举类型兼容性
数字枚举与数字兼容
enum Gender{
Male,
Female
}
let value: Gender;
value = Gender. Male
value = 100
数字枚举与数字枚举不兼容
enum Gender{
Male,
Female
}
enum Animal{
Dog,
Cat
}
let value: Gender
value = Gender. Female
字符串枚举与字符串不兼容
enum Gender{
Male = "法外狂徒张三" ,
Female = "李寒冰"
}
let value: Gender
value = Gender. Male
value = Gender. Female
类的兼容性
类的工作方式与对象字面类型和接口类似,但有一个不同点: 他们同时具有静态 和实例类型 时,当比较一个类类型 的两个对象时,只有实例的成员被比较 ,静态成员 和构造函数 不影响兼容性 一个类中的私有成员 和保护成员 会影响兼容性。当一个类的实例被检查兼容性时 ,如果目标类型包含一个私有成员,那么原类型也必须包含一个源自同一个类的私有成员 (保护成员同上) public : 可多不可少 private /protected :不能相互赋值
类的兼容性—可多不可少
class Animal {
feet: number
age: number
constructor ( feet: number , age: number ) {
this . feet = feet
this . age = age
}
}
class Size {
feet: number
constructor ( numFeet: number ) {
this . feet = numFeet
}
}
let anm: Animal
let si: Size
si = anm
类的兼容性—private/protected
class Animal {
private feet: number
constructor ( name: string , numFeet: number ) {
this . feet = numFeet
}
}
class Size {
private feet: number
constructor ( numFeet: number ) {
this . feet = numFeet
}
}
let anm: Animal
let si: Size
泛型的兼容性
interface Empty< T > { }
let x: Empty< number >
let y: Empty< string >
x = y
y = x
interface NotEmpty< T > {
data: T
}
let x1: NotEmpty< string >
let y1: NotEmpty< number >