typescript-泛型-类型检查

/**
 * 泛型: 不预先确定的数据类型,具体的类型在使用的时候才能确定。
 */

 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 能够在特定的区块中保证变量属于某种确定的类型。
  *     可以在此区块中放心的引用此类型的属性,或者调用此类型的方法。
  */
原文地址:https://www.cnblogs.com/chengyunshen/p/12858732.html