typescript 入门篇
TypeScript是一种由微软开发的自由和开源的编程语言。它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。安德斯·海尔斯伯格,C#的首席架构师,已工作于TypeScript的开发
本篇是一个入门教程,包含一些 es6为基础,重点篇幅是《面向对特征这一篇幅》
——作者 Ruodaun 转载请注明出处
配合 github实例:https://github.com/Chad97/My-notes/tree/master/typescript
基础类型
1.布尔值
let isDone: boolean = false;
2. 数字
-
和JavaScript一样,TypeScript里的所有数字都是浮点数。 这些浮点数的类型是number。 除了支持十进制和十六进制字面量,TypeScript还支持ECMAScript 2015中引入的二进制和八进制字面量
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
let binaryLiteral: number = 0b1010;
let octalLiteral: number = 0o744;
3.字符串
let Name: string = 'joud'
Name = 'bob'
let name: string = `Gene`;
let age: number = 37;
let sentence: string = `Hello, my name is ${ name }.
I'll be ${ age + 1 } years old next month.`;
let sentence: string = "Hello, my name is " + name + ".\n\n" +
"I'll be " + (age + 1) + " years old next month.";
4.数组
let list: number[] = [1, 2, 3]
let list2: Array<Number> = [3, 2, 1]
元组 Tuple
let x: [string, number];
x = ['hello', 10]
x = [10, 'hello']
console.log(x[0].substr(1));
console.log(x[1].substr(1));
x[3] = 'world';
console.log(x[5].toString());
x[6] = true;
5.枚举 enum
enum Color {read, green, blue}
let c: Color = Color.read;
enum Color {red = 1, green, blue}
enum Color {Red = 1, Green = 2, Blue = 4}
let c: Color = Color.Green;
enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];
console.log(colorName);
6. 任意值 any
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;
notSure = true;
let notSure: any = 4;
notSure.ifItExists();
notSure.toFixed();
let prettySure: Object = 4;
prettySure.toFixed();
let list: any[] = [1, true, "free"];
list[1] = 100;
7.空值 void
function warnUser(): void {
console.log("This is my warning message");
}
8.Null 和 Undefined
let u: undefined = undefined;
let n: null = null;
9.Never
function error(message: string): never {
throw new Error(message);
}
function fail() {
return error("Something failed");
}
function infiniteLoop(): never {
while (true) {
}
}
10.Object
declare function create(o: object | null): void;
create({ prop: 0 });
create(null);
create(42);
create("string");
create(false);
create(undefined);
变量
1.var
for (var i = 0; i < 10; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}
2.let
- 跨几作用域具体看这2段代码的区别,一个i被覆盖,一个没有被覆盖
for (let i = 0; i < 10; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}
3.const
它们与let 声明相似,但是就像它的名字所表达的,它们被赋值后不能再改变。 换句话说,它们拥有与let 相同的作用域规则,但是不能对它们重新赋值。
这很好理解,它们引用的值是不可变的。
const numLivesForCat = 9;
const kitty = {
name: "Aurora",
numLives: numLivesForCat,
}
// Error
kitty = {
name: "Danielle",
numLives: numLivesForCat
};
// all "okay"
kitty.name = "Rory";
kitty.name = "Kitty";
kitty.name = "Cat";
kitty.numLives--;
解构 And 展开
let [, second, , fourth] = [1, 2, 3, 4];
let first = [1, 2];
let second = [3, 4];
let bothPlus = [0, ...first, ...second, 5]
generator
function * dosomething () {
console.log("start")
yield;
console.log("finish")
yield;
console.log("end")
}
let fn1 = dosomething();
fn1.next()
fn1.next()
fn1.next()
function* generatorGet(stock: any) {
while (true) {
yield Math.random()*100
}
}
var res = generatorGet('alibaba')
var myStock = 35;
var price = 100;
while (price > myStock) {
price = res.next().value;
console.log(`价格小于35returnreturn ${price}`);
}
console.log(`whole -- ${price}`)
箭头表达式
var sum = (a1: number, a2: number, a3: number = 0) => a1 + a2 +a3;
console.log(sum(1,1))
console.log(sum(1,1,1))
var gg = (res: number) => res+1;
const myarr = [1,2,3,4]
console.log(myarr.filter(val => val%2 == 0))
function aaa (name: string) {
this.name = name
setInterval( () =>{
console.log(name)
},1000)
}
var a2 =new aaa('a')
表达式for of 循环
var arr1 = [1, 2, 3, 4]
arr1.le = 'num'
arr1.forEach(val => console.log(val))
for (let i in arr1) {
console.log(i)
}
for (let i in arr1) {
console.log(arr1[i])
}
for (let i of arr1) {
console.log(i)
if (i === 2) {
break
}
}
var str = 'aabbcc'
for (const item of str) {
console.log(item)
}
面向对象特征
1.类的定义
在TypeScript里,我们可以使用常用的面向对象模式。 基于类的程序设计中一种最基本的模式是允许使用继承来扩展现有的类。
class Person {
constructor (public name: string) {
console.log(`哈哈${name}`)
}
eat () {
console.log(this.age)
}
private age=18
}
-
一些总结
-
默认为public
-
private 私有的
-
protected
-
protected 修饰符与private 修饰符的行为很相似,但有一点不同,protected 成员在派生类中仍然可以访问。例如
class Person {
protected name: string;
constructor(name: string) { this.name = name; }
}
class Employee extends Person {
private department: string;
constructor(name: string, department: string) {
super(name)
this.department = department;
}
public getElevatorPitch() {
return `Hello, my name is ${this.name} and I work in ${this.department}.`;
}
}
let howard = new Employee("Howard", "Sales");
console.log(howard.getElevatorPitch());
console.log(howard.name);
-
readonly修饰符 使用readonly 关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化
-
存取器
- ypeScript支持通过getters/setters来截取对对象成员的访问。 它能帮助你有效的控制对对象成员的访问。
下面来看如何把一个简单的类改写成使用get 和set 。 首先,我们从一个没有使用存取器的例子开始。
class Employee {
fullName: string;
}
let employee = new Employee();
employee.fullName = "Bob Smith";
if (employee.fullName) {
console.log(employee.fullName);
}
我们可以随意的设置fullName ,这是非常方便的,但是这也可能会带来麻烦。
下面这个版本里,我们先检查用户密码是否正确,然后再允许其修改员工信息。 我们把对fullName 的直接访问改成了可以检查密码的set 方法。 我们也加了一个get 方法,让上面的例子仍然可以工作。
let passcode = "secret passcode";
class Employee {
private _fullName: string;
get fullName(): string {
return this._fullName;
}
set fullName(newName: string) {
if (passcode && passcode == "secret passcode") {
this._fullName = newName;
}
else {
console.log("Error: Unauthorized update of employee!");
}
}
}
let employee = new Employee();
employee.fullName = "Bob Smith";
if (employee.fullName) {
alert(employee.fullName);
}
我们可以修改一下密码,来验证一下存取器是否是工作的。当密码不对时,会提示我们没有权限去修改员工。
对于存取器有下面几点需要注意的:
首先,存取器要求你将编译器设置为输出ECMAScript 5或更高。 不支持降级到ECMAScript 3。 其次,只带有get 不带有set 的存取器自动被推断为readonly 。 这在从代码生成.d.ts 文件时是有帮助的,因为利用这个属性的用户会看到不允许够改变它的值。
2.继承
class Person {
constructor (public name: string) {
console.log(`哈哈${name}`)
}
eat () {
console.log(this.age)
}
private age=18
}
class American extends Person {
constructor () {
super ('jude')
}
code: number = 888;
work () {
console.log(this.code)
}
}
var a1 = new American()
console.log(a1.name)
a1.eat()
a1.work()
2.泛型
var workres: Array<Person> = [];
workres[0] = new Person('zs');
workres[1] = new American();
workres[2] = new Person('xm', 'f');
workres[3] = 3
3.接口
TypeScript的核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。 在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约
interface
interface iperson {
name: string,
age: number
}
class Animal {
constructor (public belong: iperson ) {
}
}
var aa1 = new Animal({
name: '二哈',
age: 3
})
implements
interface dog {
call ()
}
class Sheep implements dog {
call () {
console.log('咩咩咩')
}
}
class Tiger implements dog {
call () {
console.log('吼吼吼')
}
}
4.模块 Module
http://es6.ruanyifeng.com/?search=模块&x=0&y=0#docs/module
和es6 差不多 文件作用域,自行体会
5.注解(annotation)
为程序的元素、类、方法、变量,加上更直观的说明,这些说明信息与程序的业务逻辑无关,而是供指定框架或工具使用
这是一个由Angular2写的项目,我们看到AppComponent上面有个@Compoent注解
这个@Compoent注解本身是由Angular2框架提供的
在这个注解里面有一些属性
这些属性告诉Angular2怎么处理AppComponent这样一个TypeScript类
这个意思就是说在Angular2框架里面我们实例话应该AppComponent类,
Angular框架应该去加载app.component.html页面和app.component.css,然后展示在页面上
6.类型定义文件 (*.d.ts)
.d.ts 其实就是在typescript里面使用,js的库,而作为js的超集ts自然是支持的,只是需要类型定义文件而已,就是.d.ts ,例如想在 ts项目中使用jQuery,下面提供了几个库,供参考
|
请发表评论