TypeScript是一种给JavaScript添加特性的语言扩展。增加的功能包括:
TypeScript是JavaScript的超集,扩展了JavaScript的语法,因此现有的JavaScript代码可与TypeScript一起工作,无需任何修改,TypeScript通过类型注解提供编译时静态类型检查。
TypeScript可处理已有的JavaScript代码,并只对其中的TypeScript代码进行编译。
// 第一个TypeScript实例:
const hello:string = 'Hello TypeScript! Hello World!'
console.log(hello)
NPM安装TypeScript
如果你的本地环境已经安装了npm工具,可以使用以下命令来安装。
npm config set registry https://registry.npmmirror.com
npm install -g typescript
tsc -v
var message:string = 'Hello World!'
console.log(message)
通常我们使用.ts作为TypeScript代码的文件名。
然后执行以下命令将TypeScript转换为JavaScript代码:
tsc app.ts
var message = 'Hello World!'
console.log(message)
node app.js
tsc file1.ts file2.ts file3.ts
tsc ts-hw.ts --declaration
// 以上命令会生成ts-hw.d.ts、ts-hw.js两个文件。
TypeScript 会忽略程序中出现的空格、制表符和换行符。
空格、制表符通常用来缩进代码,使代码易于阅读和理解。
TypeScript 区分大写和小写字符。
每行指令都是一段语句,你可以使用分号或者不使用,分号在TypeScript中是可选的,建议使用。
console.log('aaa');console.log('bbb');
注释是一个良好的习惯,虽然很多程序员不喜欢写注释,但还是建议你在写每段代码写上文字说明。
注释可以提高程序的可读性。
注释可以包含有关程序一些信息,如代码的作者,有关函数的说明等。
编译器会忽略注释。
面向对象是一种对现实世界理解和抽象的方法。
TypeScript 是一种面向对象的编程语言。
面向对象主要有两个概念:对象和类。
TypeScript 面向对象编程实例:
class Site {
name():void {
console.log('aaa')
}
}
var obj = new Site();
obj.name()
以上实例定义了一个类Site,该类有一个方法name(),该方法在终端上输出字符串aaa。
new 关键字创建类的对象,该对象调用方法name()。
编译后生成的JavaScript代码如下:
var Site = /** @class */ (function () {
function Site() {
}
Site.prototype.name = function () {
console.log('aaa')
}
return Site;
}());
var obj = new Site();
obj.name();
// 在元素类型后面加上[]
let arr:number[] = [1, 2];
// 或者使用数组泛型
let arr:Array<number> = [1, 2];
let x:[string, number];
x = ['aaa', 1] // 运行正常
x = [1, 'aaa'] // 报错
console.log(x[0]) // 输出aaa
enum Color {Red, Green, Blue};
let c:Color = Color.Blue;
console.log(c) // 输出2
let x:any = 1; // 数字类型
x = ‘lgg’; // 字符串类型
x = false;// 布尔类型
改写现有代码时,任意值允许在编译时可选择地包含或移除类型检查,示例代码如下:
let x:any = 4;
x.ifItExists(); // 正确,ifItExists方法在运行时可能存在,但这里并不会检查。
x.toFixed(); // 正确。
1、null
在JavaScript中null表示“什么都没有”。
null是一个只有一个值的特殊类型。表示一个空对象引用。
用typeof检测null返回的是object。
2、undefined
在JavaScript中,undefined是一个没有设置值的变量。
typeof一个没有值的变量会返回undefined。
Null和Undefined是其他任何类型(包括void)的子类型,可以赋值给其他类型,如数字类型,此时,赋值后的类型会变成null或undefined。而在TypeScript中启用严格的空jiao yan空校验(–strictNullChecks)特性,就可以使得null和undefined只能被赋值给void或本身对应的类型,示例代码如下:
// 启用 --strictNullChecks
let x:number;
x = 1; // 编译正确
x = undefined; // 编译错误
x = null; // 编译错误
上面的例子中变量x只能是数字类型。如果一个类型可能出现null或者undefined,可以用|来支持多种类型,示例代码如下:
// 启用 --strictNullChecks
let x:number | null | undefined;
x = 1; // 编译正确
x = undefined; // 编译正确
x = null; // 编译正确
never是其它类型(包括null和undefined)的子类型,代表从不会出现的值。这意味着声明为never类型的变量只能被never类型所赋值,在函数中它通常表现为抛出异常或无法执行到终止点(例如无限循环),示例代码如下:
let x : never;
let y : number;
// 编译错误,数字类型不能转为never类型
x = 123;
// 运行正确,never类型可以赋值给never类型
x = (() => { throw new Error('exception') })();
// 运行正确,never类型可以赋值给 数字类型
y = (() => { throw new Error('exception') })();
// 返回值为never的函数可以抛出异常的情况
function error(message: string): never {
throw new Error(message)
}
// 返回值为never的函数可以是无法被执行到的终止点情况
function loop():never {
while (true) {}
}
变量是一种使用方便的占位符,用于引用计算机内存地址。
我们可以把变量看作存储数据的容器。
TypeScript变量的命名规则:
var [变量名]:[类型] = 值;
例如:
var userName:string = "lgg";
var [变量名]:[类型];
例如:
var userAge:number;
var [变量名] = 值;
例如:
var userName = 'lgg';
var [变量名];
例如:
var name;
实例:
var uname:string = 'lgg';
var score1:number = 18;
var score2:number = 10.90;
var sum = score1 + score2;
console.log("名字:" + uname)
console.log("第一个科目成绩:" + score1)
console.log("第二个科目成绩:" + score2)
console.log("总成绩:" + sum)
**注意:**变量不要使用name否则会与DOM中的全局window对象下的name属性出现了重名。
使用tsc命令编译以上代码,得到如下JavaScript代码:
var uname = 'lgg';
var score1 = 18;
var score2 = 10.90;
var sum = score1 + score2;
console.log("名字: " + uname);
console.log("第一个科目成绩: " + score1);
console.log("第二个科目成绩: " + score2);
console.log("总成绩: " + sum);
执行该JavaScript代码输出结果为:
名称:lgg
第一科目成绩:18
第二科目成绩:10.90
总成绩:28.90
TypeScript遵循强类型,如果将不同的类型赋值给变量会编译错误,如下实例:
var num:number = "hello" // 这个代码会编译错误
类型断言可以用来手动指定一个值的类型,即允许变量从一种类型更改为另一种类型。
<类型>值
// 或
值 as 类型
// 实例
var str = '1';
var str2:number = <number> <any> str // str、str2是string类型
console.log(str2)
TyprScripts是怎么确定单个断言是否足够:
当S类型是T类型的子集,或者T类型是S类型的子集时,S能被成功断言成T。这是为了在进行类型断言时提供额外的安全性,完全毫无根据的断言是危险的,如果你想这么做,你可以使用any。
它之所以不被称为类型转换,是因为转换通常意味着某种运行时的支持。但是,类型断言纯粹是一个编译时语法,同时,它也是一种为编译器提供关于如何分析代码的方法。
编译后,以上代码会生成如下JavaScript代码:
var str = '1';
var str2 = str; // str、str2是string类型
comsole.log(str2)
// 执行输出结果为
1
当类型没有给出时,TypeScript编译器利用类型推断来推断类型。
如果由于缺乏声明而不能推断出类型,那么他的类型被视作默认的动态any类型。
var num = 2; // 类型推断为number
console.log("num 变量的值为:" + num);
num = "12"; // 编译错误
console.log(num);
error ts2322: Type '"12"' is not assignable to type 'number'
变量作用域指定了变量定义的位置。
程序中变量的可用性由变量作用域决定。
TypeScript有以下几种作用域:
var global_num = 12 // 全局变量
class Numbers {
num_val = 13; // 实例变量
static sval = 10; // 静态变量
storeNum():void {
var local_num = 14; // 局部变量
}
}
console.log("全局变量为:"+ global_num);
console.log(Numbers.sval); // 静态变量
var obj = new Numbers();
console.log("实例变量:"+ obj.num_val)
以上代码使用tsc命令编译为Javascript代码为:
var global_num = 12; // 全局变量
var Numbers = /** @class */(function(){
function Numbers() {
this.num_val = 13; // 实例变量
}
Numbers.prototype.storeNum = function() {
var local_num = 14; // 局部变量
};
Numbers.sval = 10; // 静态变量
return Numbers;
}())
执行以上的JavaScript代码,输出结果为:
全局变量: 12
10
实例变量:13
运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算。
考虑一下运算:
7 + 5 = 12
以上实例中7、5和12是操作数。
运算符+用于加值。
运算符=用于赋值。
TypeScript只要包含以下几种运算:
假定y=5,看以下结果:
关系运算符用于计算结果是否为true或者false。
x=5,下面的表格解释了关系运算符的操作:
逻辑运算符用于测定变量或值之间的逻辑。
给定x=6以及y=3,下表解释了逻辑运算符:
&&与||运算符可用于组合表达式。&&运算符只有在左右两个表达式都为true时才返回true。
var a=10;
var result = (a<10&&a>5)
以上实例中a < 10与a > 5是使用了&&运算符的组合表达式,第一个表达式返回了false,由于&&运算需要两个表达式都为true,所以如果第一个为false,就不再执行后面的判断(a >5跳过计算),直接返回false。
||运算符重要其中一个表达式为true,则该组合表达式就会返回true。
考虑一下实例:
var a = 10;
var result = (a > 5 || a < 10)
以上实例中a>5与a<10是使用了||运算符的组合表达式,第一个表达式返回了true,由于 || 组合运算只需要一个表达式为 true,所以如果第一个为 true,就不再执行后面的判断(a < 10 跳过计算),直接返回 true。