typescript学习笔记
2021-08-31 15:23:38 20 举报
AI智能生成
typescript 接口 泛型 类 面向对象 javasscript es5 es6 html
作者其他创作
大纲/内容
安装
npm install -g typescript
查看安装版本
tsc -version
文件名 *.ts
编译
手动编辑
tsc file.ts
自动编译
创建配置文件
tsc --init
修改tsconfig.json
outDir:'./js'
vscode中,选择终端=》运行任务=》tsc:监视typescript
等同于命令:tsc -p e:\study_new_tech\typescript\tsconfig.json --watch
类型
任意类型 any 声明为 any 的变量可以赋予任意类型的值。
数字类型 number <br>双精度 64 位浮点值。它可以用来表示整数和分数。<br><br>let binaryLiteral: number = 0b1010; // 二进制<br>let octalLiteral: number = 0o744; // 八进制<br>let decLiteral: number = 6; // 十进制<br>let hexLiteral: number = 0xf00d; // 十六进制
字符串类型 string <br>一个字符系列,使用单引号(')或双引号(")来表示字符串类型。反引号(`)来定义多行文本和内嵌表达式。<br><br>let name: string = "Runoob";<br>let years: number = 5;<br>let words: string = `您好,今年是 ${ name } 发布 ${ years + 1} 周年`;
布尔类型 boolean <br>表示逻辑值:true 和 false。<br><br>let flag: boolean = true;
数组类型 <br>声明变量为数组。<br><br>// 在元素类型后面加上[]<br>let arr: number[] = [1, 2];<br><br>// 或者使用数组泛型<br>let arr: Array<number> = [1, 2];
元组 <br>元组类型用来表示已知元素数量和类型的数组,各元素的类型不必相同,对应位置的类型需要相同。<br><br>let x: [string, number];<br>x = ['Runoob', 1]; // 运行正常<br>x = [1, 'Runoob']; // 报错<br>console.log(x[0]); // 输出 Runoob
枚举 enum <br>枚举类型用于定义数值集合。<br><br>enum Color {Red, Green, Blue};<br>let c: Color = Color.Blue;<br>console.log(c); // 输出 2
void void <br>用于标识方法返回值的类型,表示该方法没有返回值。<br><br>function hello(): void {<br> alert("Hello Runoob");<br>}
null null <br>表示对象值缺失。
undefined undefined <br>用于初始化变量为一个未定义的值
never<br>never 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值。
函数
函数返回值
function function_name():return_type { <br> // 语句<br> return value; <br>}
带参数函数
function func_name( param1 [:datatype], param2 [:datatype]) { <br><br>}<br>
function add(x: number, y: number): number {<br> return x + y;<br>}
可选参数
function buildName(firstName: string, lastName?: string) {<br> if (lastName)<br> return firstName + " " + lastName;<br> else<br> return firstName;<br>}<br><br>let result1 = buildName("Bob"); // 正确<br>let result2 = buildName("Bob", "Adams", "Sr."); // 错误,参数太多了<br>let result3 = buildName("Bob", "Adams"); // 正确
如果有多个参数,可选参数必须配置在最后一个参数上
默认参数
function calculate_discount(price:number,rate:number = 0.50) { <br> var discount = price * rate; <br> console.log("计算结果: ",discount); <br>} <br>calculate_discount(1000) <br>calculate_discount(1000,0.30)
剩余参数
function buildName(firstName: string, ...restOfName: string[]) {<br> return firstName + " " + restOfName.join(" ");<br>}<br> <br>let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
函数的最后一个命名参数 restOfName 以 ... 为前缀,它将成为一个由剩余参数组成的数组,索引值从0(包括)到 restOfName.length(不包括)。
function addNumbers(...nums:number[]) { <br> var i; <br> var sum:number = 0; <br> <br> for(i = 0;i<nums.length;i++) { <br> sum = sum + nums[i]; <br> } <br> console.log("和为:",sum) <br> } <br> addNumbers(1,2,3) <br> addNumbers(10,10,10,10,10)
函数重载
function disp(s1:string):void; <br>function disp(n1:number,s1:string):void; <br> <br>function disp(x:any,y?:any):void { <br> console.log(x); <br> console.log(y); <br>} <br>disp("abc") <br>disp(1,"xyz");
类
定义示例
class Car { <br> // 字段 <br> engine:string; <br> <br> // 构造函数 <br> constructor(engine:string) { <br> this.engine = engine <br> } <br> <br> // 方法 <br> disp():void { <br> console.log("发动机为 : "+this.engine) <br> } <br>}
实例化
var obj = new Car("Engine 1")
继承
class Shape { <br> Area:number <br> <br> constructor(a:number) { <br> this.Area = a <br> } <br>} <br> <br>class Circle extends Shape { <br> disp():void { <br> console.log("圆的面积: "+this.Area) <br> } <br>}<br> <br>var obj = new Circle(223); <br>obj.disp()
class Man {<br> protected name: string<br> constructor(name: string) {<br> this.name = name<br> }<br> run(): void {<br> console.log(`${this.name} is running`)<br> }<br>}<br><br>class SuperMan extends Man {<br> fly(): void {<br> console.log(`${this.name} can fly`)<br> }<br>}<br><br>let man: Man = new SuperMan('kongxm')<br>man.run()<br><br>let superMan: SuperMan = new SuperMan('outman')<br>superMan.run()<br>superMan.fly()
访问控制修饰符
public(默认) : 公有,可以在任何地方被访问。<br><br>protected : 受保护,可以被其自身以及其子类和父类访问。<br><br>private : 私有,只能被其定义所在的类访问。
static 关键字
class StaticMem { <br> static num:number; <br> <br> static disp():void { <br> console.log("num 值为 "+ StaticMem.num) <br> } <br>} <br> <br>StaticMem.num = 12 // 初始化静态变量<br>StaticMem.disp() // 调用静态方法
抽象类(多态)
abstract class Animal {<br> protected name: string<br> constructor(name: string) {<br> this.name = name<br> }<br> abstract eat(): void<br>}<br><br>class Dog extends Animal {<br> eat(): void {<br> console.log(`${this.name} eat meat.`)<br> }<br>}<br><br>let doc: Animal = new Dog('wang cai')<br>doc.eat()
接口
属性接口
interface Login {
name: string
password: string
}
let doLogin = (form: Login) => {
console.log(`${form.name} & ${form.password}`)
}
doLogin({
name: 'kxm',
password: 'pwd'
})
函数接口
interface LoginForm {<br> (usernmae: String, password: number): void<br>}<br><br>let wechatLogin: LoginForm = (usernmae: String, password: number) => {<br> console.log(`wechat login = ${usernmae} & ${password}`)<br>}<br><br>let alipayLogin: LoginForm = (usernmae: String, password: number) => {<br> console.log(`alipay login = ${usernmae} & ${password}`)<br>}<br><br>wechatLogin('wechat', 123)<br><br>alipayLogin('alipay', 456)
可索引接口
基本没什么卵用
类接口
interface Vehicle {<br> name: string;<br> run(tips: string): void<br>}
class Car implements Vehicle {<br> name: string;<br><br> constructor(name: string) {<br> this.name = name<br> }<br><br> run(): void {//子类实现不一定需要有参数值<br> console.log('car name = ', this.name)<br> }<br>}
class Bus implements Vehicle {<br> name: string;<br><br> constructor(name: string) {<br> this.name = name<br> }<br><br> run(tips: string): void {<br> console.log('bus name = ', this.name)<br> }<br>}
接口继承
interface Human {<br> eat(): void<br>}<br>
interface Kid extends Human {<br> play(): void<br>}<br>
class Programer implements Kid {<br> play(): void {<br> throw new Error("Method not implemented.");<br> }<br> eat(): void {<br> throw new Error("Method not implemented.");<br> }<br>}<br>
泛型
泛型类
class TypeInfo<T> {<br> print(str: T): void {<br> if (typeof (str) === 'number') {<br> console.log('this is type of number')<br> }<br> if (typeof (str) === 'string') {<br> console.log('this is type of string')<br> }<br> }<br>}<br><br>let stringType: TypeInfo<String> = new TypeInfo()<br>stringType.print('string')<br><br>let numberType: TypeInfo<Number> = new TypeInfo()<br>numberType.print(123)<br>
泛型接口
interface MyConfig<T> {<br> (config1: String, config2: T): T<br>}<br><br>let myConfig: MyConfig<Number> = (config1: String, config2: Number): Number => {<br> return config2;<br>}<br><br>myConfig("1", 2)
类作为泛型参数
class Person {<br> username: string<br> age: number<br> constructor(params: {<br> username: string,<br> age: number<br> }) {<br> this.username = params.username<br> this.age = params.age<br> }<br>}<br>
class Person2 {<br> username: string<br> age: number<br> constructor(username: string, age: number) {<br> this.username = username<br> this.age = age<br> }<br>}<br>
class MysqlTool<T extends Person> {<br> add(obj: T): void {<br> console.log('add method ', obj)<br> }<br>}<br><br>let person: Person = new Person({ username: 'kxm', age: 30 })<br>let mysqlTool = new MysqlTool()<br>mysqlTool.add(person)
模块
方式一
定义
export let url = 'http://www.baidu.com'<br><br>export function doSomething() {<br> console.log('do something else')<br>}
使用
import { url, doSomething } from "./modules/_m1"<br><br>console.log(url)<br><br>doSomething()
方式二
定义
let url = 'http://www.baidu.com'<br><br>function doSomething() {<br> console.log('do something else')<br>}<br><br>export {<br> url,<br> doSomething<br>}
使用
同上
方式三
定义
function doSomething() {
console.log('do something else')
}
//有且只能定义一次
export default doSomething
使用
//这里就一个 export default,没有花括号
import doSomething from "./modules/_m3"
doSomething()
命名空间
0 条评论
下一页