Any
function identity(arg: any) : any {
return arg;
}
使用any类型会导致这个函数可以接收任何类型的arg参数
any类型可能出现传入的类型和返回的类型不相同。比如:我们传入一个数字,但任何类型的值都可能被返回。
泛型 / 变量类型 T
function identity<T>(arg: T) : T {
return arg
}
我们给identity函数添加了类型变量T。变量类型T 帮助我们捕获用户传入的类型(比如:number),之后我们就可以使用这个类型。之后我们再次使用了T作为返回值类型,这样我们就可以保证参数类型和返回值类型是相同的。
这个版本的identity函数叫做泛型,因为它可以适用于多个类型。
Any 和 泛型 的区别
泛型可以确保参数类型和返回值类型一致, Any不可以。
调用泛型函数
方式一: 传入所有的参数,包含类型参数
let output = identity<string>("myString");
方式2: 利用类型推论--即编译器会根据传入的参数自动的帮助我们确定T的类型
let output = identity("myString")
注意:我们没必要使用尖括号(<>)来明确的传入类型;编译器可以查看myString 的值,然后把T设置为它的类型。类型推论帮助我们保持到吗精简和高可读性。如果编译器不能够自动的推断出类型的话,只能像上面那样明确的传入T的类型,在一些复杂的情况下,这是可能出现的。
泛型约束(extends关键字实现约束)
interface Lengthwise {
length: number
}
function loggingIdentity<T extends Lengthwise>(arg : T) : T {
console.log(arg.length)
}
unknown
如果是any,你可以任意的取值赋值,不会进行任何的类型检查
unkown,必须先解析断言 就是使用typeof 或 instanceof来判断类型