/*TS编译后的文件是js,即使编译不成功也会转成js文件。同时注意,
ts可以被编译成任意版本的js,默认是js3.0。其中的let会被转化为var(因为let是js6的标准)*/
/*TS定义的同时,规定了a的类型为一种类型,如例一。或者定义的同时就赋值了一种类型,如例二。
或者直接用字面量进行声明。如例三。但后续赋值为了其他类型或赋值为了其他字面量,就是不合法的。*/
//例一
let a :number;
a=10;
a='lalal';
console.log(a);
//例二
let a = 10;
a = 'lalala';
console.log(a);
//例三
let a : 10;//注意是冒号,相当于a是常量了。
a = 11;//报错
//不同于js中可以传递多个参数且对参数和返回值的类型不做限制。
//ts不可以传递多个参数(但是可以传少参数)。同时也可以对返回值和参数类型做声明
function sum(a:number,b:number)
{
return a+b;
}
console.log(12,"ala");//按理来说会报错,但是我的电脑没有
function sum(a:number,b:number):number
{
return a+b;
}
console.log(12,"lala");//按理来说会报错,但是我的电脑没有
//联合类型
let a:"male"|"female";
a = "male";//合法
a = "female";//合法
a = "human";//不合法
//函数返回值也可以设置为联合类型
function sum():number|string
{//省略
}
//any 在实际使用中要尽量避免
let a:any;//就相当于let a;只是显式any和隐式any的区分。
a=10;
a="lala";
a=true;//都合法,相当于js的原生语法了。用了any就相当于对该变量关闭了类型检测。
let b:unknown;
b= "kakaka";
//any和unknown的却别在于,any的变量可以赋值给其他任意类型的变量。
//但是unknown的变量除了同样赋值给unknown或any类型的变量,其他都不行。
//即使unknown的初始化值和该变量类型一样。所以unknown相当于一个类型安全的any。
let c:string;
c=a;//合法
c=b;//不合法
let a:unknown;
a=123;
let b:number;
//想要将unknown赋值给除unknown和any外其他类型的变量。可以使用以下两种方法。
//类型断言的第一种写法
b=a as number;
//类型断言的第二种写法
b=a;
//类型自主判断
if(typeof a =="number")
{b=a;}
/*注意,类型断言时,即使a的赋值本身的类型不是断言的类型,但依旧可以通过编译。
相当于强制类型转换。但boolean转成number时不会转成0或1,而是依旧为true或false;*/
let a:unknown;
a=true;
let b:number;
b=a as number;
console.log(b);//打印为true。
//number转为boolean时不会成为
//函数的返回值如果是void,可以返回null或者undefined
//函数的返回值如果never,则啥都不能返回。一般在函数体里只能抛出异常。用来打断程序执行。
function sum():never
{
throw new Error("报错了");
}
//object表示一个js对象,譬如{}是一个对象,function(){}也是一个对象
let a:object;
a={};
a=function sum2(){};
//但实际使用时上面那种写法并不实用,因为js中大部分都是对象。
//我们想要知道的是一个变量是否是一个具体的对象,即里面是否有某种具体属性的对象。
//语法:let b:{属性名:属性类型,属性名?:属性类型,……};其中?表示可选,即有也行,没有也行。
let b:{age:number};//像是这样,我们就知道了b的类型是一个有且仅有一个number属性的对象。
b={};//此时再对其赋值一个空对象或属性不符的对象,会报错
b={age:12};//正确赋值写法
let c:{age:number, [propName: string]:any};
//表示只要属性里面有类型为number的age,其他属性怎样都行。
//其中propName可以写成任意名称,只要是字符串的就行,因为规定了是string。
//如果改成了number,那是number就行。同理,any表示任意属性都行,如果改成了string,
//则属性值都得是string,gender_is_male就会报错。
c={age:12 , name:'shan',gender_is_male:true};
let get_id:(stu_name:string ,stu_age:number)=>number;
//该写法表示get_id是一个含有两个number属性,且返回值也是number的函数。
get_id=function(n1,n2)
{
return n2-1;
}
//Array,数组,有两种写法
let a:string[];
let b:number[];
let c:boolean[];
let d:Array;
//tuple就是固定长度的数组
let e:[string,string];
//enum
enum Gender{
male=0,
female=1
}
let f:{age:number,gender:Gender};
f={
age=12;
gender=Gender.female
}
let a:{name:string}&{age:number};
a={name:"shan",age=19};
//一般用于合并大量对象,不能直接用let a:{name:string,age:number};时 | 或 同理
type b=1|2|3|4|5;
let c:b;//相当于c也是b的类型。
let box = document.getElementById("box1");
//表示从浏览器中找到Id为Box1的元素并赋值给box1
box?.addEventListener('click',function(){
//但不一定能找到这样的元素,所以用问号判断box1是否存在
alert("hello")//如果存在才执行点击事件。
})
如何知道TS的安装目录?http://t.csdn.cn/1Yniv