1. any类型
不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段,可以使用 any类型来标记这些变量。
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
let list: any[] = [1, true, "free"];
list[1] = 100;
2. object
object表示非原始类型,也就是除number,string,boolean,symbol,null或undefined之外的类型。
Object类型的变量只是允许你给它赋任意值 - 但是却不能够在它上面调用任意的方法,即便它真的有这些方法。(下面的代码都已经打印出来了‘b.join():5-abc’,但是依然报了错)
any也允许你给它赋任意值 - 而且能够在它上面调用任意的方法。
let a:any = [5, 'abc'];
console.log('a.toFixed():', a.join('-'))
let b:object = a;
console.log('b.toFixed():', b.join('-')) // Property 'join' does not exist on type 'object'.
// b = 4; // error:不能将4赋给object类型
a.push('88')
console.log('b a:', b, a) // b a: [5, "abc", "88"] [5, "abc", "88"]
b = [4]
console.log('b a:', b, a) // b a: [4] [5, "abc", "88"]
3. 枚举enum
枚举有点像数组,它有个元素编号,从0开始,用法又有点像js对象。
enum Color {Red, Green, Blue}
console.log(Color) // {0: "Red", 1: "Green", 2: "Blue", Red: 0, Green: 1, Blue: 2}
看到打印的值,就明白了,它既可以通过编号获取定义的值,也可以通过定义的值,获取编号。
enum Color {Red = 1, Green}
enum Color {Red2 = 5, Green2}
console.log(Color)
// {1: "Red", 2: "Green", 5: "Red2", 6: "Green2", Red: 1, Green: 2, Red2: 5, Green2: 6}
可以重复声明,而且编号可以手动修改。
enum Color {Red = 1, Green = 6}
enum Color {Red2 = 5, Green2}
console.log(Color)
// {1: "Red", 5: "Red2", 6: "Green2", Red: 1, Green: 6, Red2: 5, Green2: 6}
手动声明,有可能导致意料之外的错误,Green被覆盖了。
Green的下标是6,Green2的下标也是6,后执行的把先执行的覆盖了。
4. 函数的返回类型:void never
5. 类型断言
类型断言并不能强制转换,也不会进行特殊的数据检查和解构。 它没有运行时的影响,只是在编译阶段起作用。 TypeScript会假设你(程序员),已经进行了必须的检查。
语法,其一是“尖括号”语法:
let someValue: any = 123;
let strLength: number = (<string>someValue).length;
console.log(strLength) // undefined
(不能强制转换,number变量并没有length属性)
另一个为as语法:(在.jsx文件里,只能用这种)
let someValue: any = "123";
let strLength: number = (someValue as string).length;
console.log(strLength) // 3
网友评论