Learning TypeScript 0x0 基础

架构及设计目标

TS是JS的超集。

安装

npm i -g typescript

新建test.ts

var  t : number = 1;

编译

tsc test.ts

编译结果test.js

var t = 1;

类型

可选的静态类型声明

var counter; // 未知(any)类型
var counter = 0; // number类型(推断出)
var counter : number; // number类型
var counter : number = 0; // number类型

变量、基本类型和运算符

基本类型

  • boolean
var isDone: boolean = false;
  • number
var height: number = 6;
  • string
var name: string = 'blob';
  • array
var list: number[] = [1,2,3];
var list:Array<number> = [1,2,3]; // 使用泛型数组类型Array
  • enum 为了给一个数字集合更友好地命名。enum类型中的成员默认是从0开始,可以手动设置成员中的值更改这种默认行为
enum Color {Red, Green, Blue };
var c: Color = Color.Green;
  • any 任意JavaScript值
var notSure: any = 4;
notSure = 'maybe a string'
notSure = false

var list:any[] = [1, true, 'free'];
list[1] = 100;
  • void 在某种意义上,any的对立面就是void,即所有的类型都不存在的时候。即在一个函数没有返回值时看到他
function warnUser(): void {
    alert('This is my warning message');
}

JS的原始类型中包括了undefined和null。在js中,undefined是全局作用域的一个属性,他会赋值给那些被声明但未被初始化的变量。null是一个字面量,可以被赋值给那些表示没有值的变量。

在TS中不能把null和undefined当做类型使用。

var、let和const

var mynum : number = 1;
let isValid : boolean = true;
const apiKey : string = 'OOOOObbbbb';

 var声明的变量保存在最近的函数作用域中。

let声明的变量保存在最近的比函数作用域小的作用域块中

const关键字会创建一个保存在创建位置作用域中的常量。

联合类型

var path : string[]|string;
path = '/temp/log.xml';
path = ['/temp/log.xml', '/temp/errors.xml'];
path = 1; // error

联合类型用来声明可以存储多种类型值的变量。

类型守护

可以在运行时使用typeof或者instanceof对类型进行验证。TS语言服务会在if区寻找这些运算符,然后对应地修改类型

var x: any = {/*...*/}
if(typeof x === 'string') {
    console.log(x.splice(3,1);// 错误,'string'上不存在splice方法
}
// x 依然是any类型
x.foo(); //合法

TS语言服务可以读懂在条件语句中使用typeof的用法。TS会自动推断出x一定是string类型,然后告诉我们splice方法不存在与string类型上。这种特性被称为类型守护

类型别名

type PrimitiveArray = Array<string|number|bollean>;
type MyNumber = number;
type NgScope = ng.Iscope;
type Callback = () => void;

环境声明

环境声明允许在TS代码中创建一个不会被编译到JS中的变量。这个特性是用来促进与现有Js代码、DOM,BOM结合而设计的。

interface ICustomConsole {
    log(arg : string) : void;
}
declare var customConsole : ICustomConsole;

使用declare创建环境声明

customConsole.log('A log entry!');

算数运算符

流程控制语句

单一选择结构

var isValid : bollean = true;
if(isValid) {
    alert('is valid!');
}

双选择结构

var isValid : boolean = true;
if(isValid) {
    alert('Is valid');
} else {
    alert('Is Not Valid');
}

三元操作符

var isValid : boolean = true;
var message = isValid ? 'Is valid!':'Is NOT valid';
alert(message);

多选结构

enum AlertLevel {
    info,
    warning,
    error
}
function getAlertSubscribers(level: AlertLevel) {
    var emails = new Array<string>();
    switch(level) {
        case AlertLevel.info:
            emails.push('cst@domain.com');
            break;
        case AlertLevel.warning:
            emails.push('development@domain.com');
            emails.push('sysadmin@domain.com');
            break;
        case AlertLevel.error:
            emails.push('development@domain.com');
            emails.push('sysadmin@domain.com');
            emails.push('mangement@domain.com');
            break;
        default:
            throw new Error('Invalid argument!');
    }
    return emails;
}
getAlertSubscribers(AlertLevel.info);// ['cst@domain.com']

语句在顶部进行判断的循环

var i : number = 0;
while (i < 5) {
    i += 1;
    console.log(i);
}

语句在底部进行判断的循环

var i: number = 0;
do {
    i += 1;
    console.log(i);
} while(i < 5);

迭代对象的属性

var obj: any = { a:1, b:2, c:3 };
for (var key in obj) {
    console.log(key+"="+obj[key]);
}

上面代码会将继承的属性也进行枚举,若只枚举自己的属性可以使用hasOwnProperty方法进行判断

计数器控制循环

for(var i: number = 0; i < 9; i++){
    consonle.log(i);
}

函数

具名函数

function greet(name?:string): string {
    if(name) {
        return 'Hi!' + name;
    } else {
        return 'Hi!';
    }
}

匿名函数

var greet = function(name?:string): string {
    if(name) {
        return 'Hi!' + name;
    } else {
        return 'Hi!';
    }
};

箭头函数

var greet = (name:string): string => {
    if(name) {
        return 'Hi!' + name;
    } else {
        return 'Hi!';
    }
};

回调函数

function sum(a: number, b: number, callback: (result: number) => void){
    callback(a+b);
}

class Character {
    funllname: string;
    constructor(firstname: string, lastname: string) {
        this.fullname = firstname + ' ' + lastname;
    }
    greet(name?: string) {
        if (name) {
            return `Hi!${name}!My name is ${this.fullname}`;
        } else {
            return `Hi!My name is ${this.fullname}`;
        }
    }
}
var spark = new Character('Jacob', 'Keyes');
var msg = spark.greet();
console.log(msg); // 'Hi!My name is Jacob Keyes'
nar msg1 = spark.greet('Dr. Halsey');
console.log(msg1);// 'Hi!Dr. Halsey!My name is Jacob Keyes'

接口

可以使用接口确保类拥有指定的结构

interface LoggerInterface {
    log(arg: any): void;
}
class Logger implements LoggerInterface {
    log(arg) {
        if(typeof console.log === 'function') {
            console.log(arg);
        }else{
            alert(arg);
        }
    }
}

也允许用接口来约束对象

interface UserInterface {
    name: string;
    password: string;
}
var user : UserInterface = {
    name: '',
    password: ' // password遗漏错误属性
};

命名空间

命名空间,又称为内部模块,被用于组织一些具有某些内在联系的特性和对象。命名空间能使代码结构更加清晰,

namespace Geometry {
    interface VectorInterface {/**/} // 不export外部访问不到
    export interface Vector2dInterface { /**/}
    export interface Vector3dInterface {/**/}
    export class Vector2d implements VectorInterface, Vector2dInterface {/**/}
    export class Vector3d implements VectorInterface, Vector3dInterface {/**/}
}
var vector2dInstance:Geometry.Vector2dInterface = new Geometry.Vector2d();
var vector3dInstance:Geometry.Vector3dInterface = new Geometry.Vector3d();

应用

module Geometry {
    export interface Vector2dInterface {
        toArray(callback: (x: number[]) => void): void;
        length():number;
        normalize();
    }
    export class Vector2d implements Vector2dInterface {
        private _x: number;
        private _y: number;
        constructor(x: number, y: number) {
            this._x = x;
            this._y = y;
        }
        toArray(callback: (x: number[]) =>  void): void {
            callback([this._x, this._y]);
        }
        length(): number {
            return Math.sqrt(this._x * this._x + this._y * this._y);
        }
        normalize() {
            var len = 1 ? this.length();
            this._x *= len;
            this._y *= len;
        }
    }
}

具体使用

var vector : Geometry.Vector2dInterface = new Geometry.Vector2d(2,3);
vector.normalize();
vector.toArray(function(vectorAsArray : number[]) {
    console(`x:${vectorAsArray[0]} y:${vectorAsArray[1]}`);
});

 

### 回答1: TypeScript 是一种开源的编程语言,它是 JavaScript 的超集,意味着所有的 JavaScript 代码都可以用 TypeScript 编写。学习 TypeScript 对于想要提高自己在前端开发领域的技能和知识的人来说非常有价值。 首先,学习 TypeScript 可以帮助开发人员在编写代码时减少错误。TypeScript 引入了静态类型检查,通过定义变量类型和函数参数类型,可以在开发过程中及早发现潜在的错误,并提供更好的代码提示和自动完成功能。这样可以减少由于类型错误导致的 bug,提高代码的可靠性和质量。 其次,TypeScript 提供了更强大的面向对象编程能力。它支持类、继承、接口等面向对象的概念,使得开发人员可以使用更优雅的方式组织和管理代码。同时,TypeScript 还支持模块化开发,可以将代码分成多个模块,提高代码的可维护性和重用性。 另外,学习 TypeScript 还可以让开发人员更好地与现有的 JavaScript 生态系统进行交互。由于 TypeScriptJavaScript 的超集,所以现有的 JavaScript 代码可以直接在 TypeScript 中使用,并且可以逐步迁移到 TypeScript,利用其提供的新特性和工具。此外,TypeScript 还可以与流行的框架和库,如 Angular、React 和 Vue.js 进行无缝集成,提供更好的开发体验和工具支持。 总的来说,学习 TypeScript 对于提高前端开发技能和能力非常有帮助。通过减少错误、提供更强大的面向对象编程能力和与 JavaScript 生态系统的无缝集成,开发人员可以写出更可靠、可维护和高质量的代码。因此,我推荐学习 TypeScript,并可以通过阅读学习 TypeScript 的 PDF 文档来深入了解和掌握这门语言。 ### 回答2: TypeScript 是微软开发的一种静态类型的JavaScript 超集,它为 JavaScript 添加了静态类型系统和其他一些语言特性,使得开发者能够更加轻松地编写和维护复杂的 JavaScript 应用程序。学习 TypeScript 的 PDF 版本可以帮助初学者更好地理解和掌握这门语言。 学习 TypeScript 的 PDF 版本提供了一种方便的学习方式。PDF 格式具有良好的阅读体验,可以在电子设备上进行阅读,随时随地学习。与在线课程或教程相比,PDF 文档更加简洁明了,可以一次性下载并离线使用。这样,学习者就可以按照自己的节奏进行学习,并在遇到问题时方便地查找相关内容。 通过学习 TypeScript 的 PDF 版本,学习者可以系统地了解 TypeScript 的基本语法、类型系统、模块化开发、面向对象编程等重要概念和特性。学习者可以按照文档的顺序逐步学习,并通过文档中的示例代码进行实践练习。PDF 文档通常会提供丰富的实例和练习,帮助学习者巩固所学知识。 学习 TypeScript 的 PDF 版本还可以作为一个日后的参考手册。在学习过程中,学习者可以在 PDF 文档中添加书签或标注关键内容,便于日后查找和使用。这样,无论是在项目开发过程中还是碰到疑惑时,学习者都可以迅速定位到所需的知识点。 总之,学习 TypeScript 的 PDF 版本是一种便捷且高效的学习方式,可以帮助学习者系统地学习掌握 TypeScript,并提供了一个方便的参考和回顾工具。对于想要深入学习 TypeScript 或者提高 JavaScript 应用程序开发技能的人来说,这样的学习资源是非常有价值的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值