/**
* 泛型: 不预先确定的数据类型,具体的类型在使用的时候才能确定。
*/
function log<T>(value: T):T {
console.log(value);
return value
}
// 调用
log<string[]>(['a'])
log<number>(2)
log(['a','b'])
// type Log = <T>(value:T) => T
// let mylog:Log = log
interface Log <T = string> {
(value:T):T
}
let mylog:Log = log
mylog('1')
// -----泛型约束
class Loger<T>{
// static name:T ; // 泛型不能应用于类的静态成员
run(value: T){
console.log(value);
return value;
}
}
let logger1 = new Loger<number>();
logger1.run(1)
let logger2 = new Loger();
logger2.run('1')
// -----
interface Length {
length:number
}
function log2<T extends Length>(value:T):T{
console.log(value,value.length);
return value
}
log2([1])
log2('123')
log2({length:1})
/**
* 泛型的好处:
* 1.函数和类可以轻松的支持多种类型,增强程序的扩展性
* 2.不必写多条函数重载,冗长的联合类型声明,增强代码可读性
* 3.灵活控制类型之间的约束
*/
/**
* 类型检查机制
* Typescript编译器在做类型检查时,所秉承的一些原则,以及表现出的一些行为。
* 作用: 辅助开发,提高开发效率。
*
* 1.类型推断
* 不需要指定变量的类型(函数返回值类型),Typescript可以根据某些规则自动地为其推断出一个类型。
* 2.类型兼容性
* 当一个类型Y可以被赋值给另一个类型X时, 类型X兼容类型Y;
* X兼容Y : X(目标类型) = Y(源类型)
*
* 兼容性口诀:
* 结构之间兼容:成员少的兼容成员多的
* 函数之间兼容:参数多的兼容参数少的
* 3.类型保护
*
* typescript 能够在特定的区块中保证变量属于某种确定的类型。
* 可以在此区块中放心的引用此类型的属性,或者调用此类型的方法。
*/