目录

1.变量

2.函数

3.类

4.接口

1.变量

1.变量的声明

// 1.即指定数据类型 也指定值
var 变量名:类型 = 值;
eg:var username:string = "libolun" // 2.不指定类型,默认类型为any
var 变量名 = 值;
eg:var username = "libolun" // 3.预设变量,指定类型
var 变量名:类型;
eg:var username:string // 4.不指定类型和值,默认类型为any, 默认值为 undefined:
var 变量名;
eg:var username

在上面四种格式中,其实最常见的是第三种,格式代码如下所示

var username:string
username = "libolun"

2.变量的作用域

变量作用域指代:根据变量定义的位置来决定变量的使用范围和生命周期。

TypeScript提供了三种不同的作用域:

  • 全局作用域

    全局变量定义在程序结构的外部,它可以在你代码的任何位置使用。

  • 类作用域

    这个变量也可以称为 属性或者字段

    类变量基本声明在类里的头部位置,不但可以在类的方法里面进行调用,也可以在类方法外面,该变量可以通过类名来访问。

    类变量也可以是静态变量,静态变量可以通过类名直接访问。

  • 局部作用域

    局部变量,局部变量只能在声明它的一个代码块(如:方法)中使用。

var global_num = 12          // 1.全局变量
class Numbers {
num_val = 13; // 2.实例变量
static sval = 10; // 3.静态变量 storeNum():void {
var local_num = 14; // 4.局部变量
}
}
console.log("全局变量为: "+global_num)
console.log(Numbers.sval) // 静态变量
var obj = new Numbers();
console.log("实例变量: "+obj.num_val)

3.联合类型

// 语法
var 变量 = 类型1|类型2|类型3|...; // 注意:联合类型(Union Types)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值。只能赋值指定的类型,如果赋值其它类型就会报错。

例子如下所示:

// 允许变量在使用过程中,值可以是给出的多个类型之一
var age:string|number; // 联合类型的定义 age = 20; // ok
age = "20"; // ok var data:string|number|number[]|string[]; // 4个类型组合,联合类型
data = 12;
console.log("数字为 "+ data);
data = "xiaoming";
console.log("字符串为 " + data);
data = [1,2,3];
console.log("数组为 " + data);
data = ["a","b","c"];
console.log("数组为 " + data);
data = true; // error TS2322: Type 'boolean' is not assignable to type 'string | number | number[]'.
console.log("布尔值为 " + data);

2.函数

typescript和javascript在函数的声明以及使用中,除了类型注解以外,并没有其他区别。所以接下来的例子中,仅仅以普通函数作为例子进行讲解,至于匿名函数,箭头函数(lambda函数),闭包函数,则不会提到。

1.定义函数的语法

// 普通函数
function func_name( param1 [:type], param2 [?:type],param3[?]....) [:return_type]{ } // lambda函数
var func = (param1:type) => expression; /*
type表示形参的数据类型,可以指定类型,也可以不指定类型
return_type 表示函数执行以后的返回值的数据类型,可以指定,也可以不指定
形参后面跟着?,表示当前参数是可选参数,可填可不填
*/

例子如下所示:

/*
普通函数的定义,参数有三种:
1.必填参数[可以限制类型]
2.可选参数:?[可以限制类型]
3.默认参数:提供了默认值[可以限定类型,即便不限定类型,typescript也会通过默认值进行类型判定]
*/
function func1(arg1,arg2:number,arg3?,arg4?:string,arg5:string="xioaming"):void{
console.log(`arg1=${arg1},arg2=${arg2},arg3=${arg3},arg4=${arg4},arg5=${arg5}`);
}

ps:关于JavaScript/TypeScript代码的执行流程

第一遍:从上到下,进行词法检测,识别关键字,分配空间[]

第二遍:从上到下,进行代码执行

举个例子:

func1(100,200,300,"400",500);
// 此处arg5导致报错,是因为typescript内置的类型系统包含了类型的判断,
// 在函数声明时的参数列表中,已经对arg5进行默认值的分配,因为这个默认值的原因,
// 所以typescript根据arg5的默认值进行了类型判断,识别到了是string,
// 因此,在调用函数时传递的参数是number就肯定报错了

ps:关于TypeScript的类型判定

2.JS/TS中箭头函数的写法

var func = (num1:number,num2:number):number => {return num1+num2}; // 原生JS的箭头函数写法
var func = (num1:number,num2:number):number => num1+num2; // typescript的箭头函数写法[允许出现表达式]
console.log( func(100,200) );

3.函数重载

错误写法:

function func1(str1:string):void{
console.log(str1);
} function func1(num1:any,str1?:any):void {
console.log(num1);
console.log(str1);
}
func1("hello");
func1(16,"hello");

正确写法:

function func1(str1:string):void;
function func1(num1:number,str1:string):void; function func1(num1:any,str1?:any):void {
console.log(num1);
console.log(str1);
}
func1("hello");
func1(16,"hello");

3.类

1.声明一个类

class Humen {
age:number;
desc():string {
return `我今年${this.age}岁`;
}
constructor(age:number) {
this.age = age
}
} var people = new Human(13);
console.log( people.desc() );

2.类的继承

class Person extends Humen {
desc():string {
return "您好,"+super.desc();
}
} var people = new Person(13);
console.log( people.desc() );

3.静态属性和方法

class Static {
// 静态属性
static num:number;
// 静态方法
static desc():void {
console.log("num 值为 "+ Static.num)
}
} Static.num = 12; // 初始化静态属性/变量
Static.desc(); // 调用静态方法

4.访问控制符

面向对象中的所谓封装,本质上就是把一系列相关的数据(属性/变量/字段)和操作数据的方法(方法/函数)集中到一个数据结构中(类),达到隐藏数据和操作数据的方法,对外暴露有限的操作数据方法。

TypeScript 中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。TypeScript 支持 3 种不同的访问权限。\

  • public(默认) : 公有的,可以在任何地方被访问。

  • protected : 受保护,可以被其自身以及其子类和父类访问。

  • private : 私有,只能被其定义所在的类访问。

// 1.公有属性: 允许任何一个地方调用
// 2.私有属性: 仅允许当前类内部进行调用
// 3.保护属性: 仅允许当前类或直接间接继承了当前类的子类内部进行调用
class Proto{
public desc(){ // 公有方法
return `我住在树上`;
}
}
class Humen extends Proto{
public address:string = "北京市"; // 公有属性
public desc(){ // 公有方法
return `我住在${this.address}`;
} private money:number = 10000; // 私有属性
private calc_money(){
return this.money*0.1; // 类的内部才可以调用私有属性,私有方法
}
// 如果允许私有属性提供给外界查看, 往往通过公有方法来进行暴露
public show_money(){
return this.calc_money();
} protected phone:string = "13300000000"; // 保护属性
protected get_phone(){ // 保护方法
return `我的手机号码:${this.phone}`; // 类的内部或者子类才可以调用保护属性/方法
}
// 如果允许保护属性提供给外界查看,往往通过公有方法来进行暴露
public show_phone(key?){
if(key == "123456"){
return this.get_phone();
}
}
} class People extends Humen{
public show_father_data(){
// return this.phone; // 调用了父类的保护属性
// return this.get_phone(); // 调用了父类的保护方法 // return this.money; // 子类无法调用父类的私有属性或方法 // return this.desc(); // 调用继承到的父类方法或者属性,如果当前类重载了则出现覆盖
return super.desc();
} public desc(){
return `您好, 我住在${this.address}`;
} } var xiaoming = new People();
// console.log(xiaoming.address);
// console.log(xiaoming.desc());
// console.log(xiaoming.show_money());
// console.log(xiaoming.show_phone());
// console.log(xiaoming.show_phone(123456));
console.log(xiaoming.show_father_data());

4.接口

1.什么是接口?

接口(interface)是一系列抽象属性和方法的集合声明,这些方法都应该是抽象的,需要由具体的类去实现,然后外界就可以通过这组抽象方法调用,让具体的类执行具体的方法。

接口的作用在开发中针对的是数据对象和类的结构进行描述和规范化。说白了,就是你老大叫你声明一个类/对象,但是这个类/对象长什么样?他会以接口的格式先定义好,然后你照着这个接口定义好的格式进行编写一个类/对象出来,免得你弄乱结构,以后没法复用代码。

一般只有在中大型项目,或者框架/大型模块中为了更好的组织代码结构才会出现抽象类/接口

2.定义一个最简单的接口

interface interface_name {
field:string,
func: ()=>string // 限定了方法名,和返回值
}

3.接口的声明和实现

interface Person {
username: string; // 接口属性,仅仅定了属性名,属性值和属性的初始化,都是在类中完成的
age: number;
desc(user: string): string; // 接口方法,仅仅定义了方法名,参数以及返回值,具体的方法代码是在类中实现的
} class Humen implements Person {
username: string;
age:number;
desc(user:string){
return `你好!${user},我叫${this.username},我今年${this.age}岁.`;
}
constructor(username: string, age: number) {
this.username=username;
this.age=age;
}
} var xiaohong = new Humen("小红",15);
console.log(xiaohong.desc("小白"));

注意:凡是实现(implements)了接口/抽象类的类,都要和接口/抽象类保持一样的属性和方法

4.如何使用接口

typescript允许直通过对象来直接实现接口,跳过了类的实现过程

interface Person {
username: string;
age: number;
desc():string
} function main(person: Person) {
return "Hello, 我叫" + person.username + ",我今年" + person.age+"岁.";
} // typescript允许直通过对象来直接实现接口,跳过了类的实现过程
// var 对象名 = <接口名称>{
// 属性;
// 方法;
// }
let user = <Person>{
username: "小白",
age: 16,
desc(){
return "hello"
}
};
console.log(main(user));
// js就是披着面向对象外壳的函数式编程语言

5.鸭子类型

在传递实例参数时,不管当前传入的实例参数是否是限定的类/接口的实例对象,只要有同样的属性/方法,那么我们就认为当前实例参数就是这个限定类/接口的实例对象。这就是所谓的鸭子类型

// 鸭子类型:
// 一个对象有效的语义,不是由继承自特定的类或实现特定的接口,
// 而是由"当前方法和属性的集合"决定 interface Person {
username: string;
age: number;
} function main(person: Person) {
return "Hello, 我叫" + person.username + ",我今年" + person.age+"岁.";
} var xm = {username:"小明",age:20}; // 问题来了,这里明明没有实现Person接口,为什么也能调用
console.log(main(xm));

ps:python中的鸭子类型

class Person(object):
def __init__(self,username,age):
self.username = username
self.age = age class Humen(object):
def __init__(self,username,age):
self.username = username
self.age = age def main(obj:Person):
return "我叫%s,我今年%s岁了" % (obj.username,obj.age) if __name__ == '__main__':
p1 = Person("小明", 15)
p2 = Humen("小白", 15)
print( main(p2) )

6.接口继承

1.单继承

interface Person {
age:number
} interface Humen extends Person {
username:string
desc(user:string):string
} class People implements Humen{
age:number;
username:string;
constructor(){ }
init(username,age){
this.age = age;
this.username=username;
}
desc(user:string):string{
return `${user},您好!我叫${this.username},我今年${this.age}岁.`
}
} var xm = new People();
console.log( xm.desc("小红") );

2.多继承

interface Person {
age:number
} interface Humen {
username:string
} interface People extends Person,Humen {
// 子接口也可以有自己的接口属性和方法 } class Student implements People{
age:number;
username:string;
desc(user:string){
return `你好!${user},我叫${this.username},我今年${this.age}岁.`;
}
constructor(username: string, age: number) {
this.username=username;
this.age=age;
}
} var xm = new Student("小白",15);
console.log(xm.desc("小黑"));

day133:2RenMJ:TypeScript的变量&函数&类&接口的更多相关文章

  1. dll的概念 dll导出变量 函数 类

    1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别:   (1)静态链接 ...

  2. typeScript入门(三)接口

      接口我感觉是很常用的一块 定义标准: 接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规 ...

  3. 【Java】变量类接口_学习笔记

    变量.类和接口 1.变量的类型 实例变量(不以static修饰) 成员变量 类变量(以static修饰) 所有变量 形参(方法签名中定义的变量) 局部变量         方法局部变量(在方法内定义) ...

  4. Android jni系统变量、函数、接口定义汇总

    在做Android jni开发时,jni为我们提供了哪些函数.接口.变量,有时候一头雾水,今天就把jni.h中定义的所有内容列出来,供自己查阅: /* * Copyright (C) 2006 The ...

  5. typescript函数类型接口

    /* 接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据, ...

  6. 高阶函数与接口混入和java匿名类

    高阶函数与接口混入和java匿名类. 高阶函数中的组件(参量)函数相当于面向对象中的混入(接口)类. public abstract class Bird { private String name; ...

  7. 感受typescript定义变量和数据类型的神奇魔力

    变量和数据类型 你的Javascript能力到达瓶颈?那是因为你还不会typescript.掌握TS,让你的开发更加准确简洁. 今天的学习中,我们接着从TS的数据类型和变量入手,感受它们的奇妙魔力. ...

  8. Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)

    在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...

  9. 24.C++- 抽象类(存虚函数)、接口、多重继承

    抽象类和接口 什么是抽象类 用来表示现实世界中的抽象概念 是一种只能定义类型,而不能产生对象的类 只能被子类继承,且抽象类的相关成员函数没有完整的体现,用来被子类重写. 比如图形(Shape)类, 就 ...

随机推荐

  1. ESP8288-01S/ESP8288-01使用经验总结

    如图:ESP8288-01S/ESP8288-01的区别 超链接 ESP8288-01S/ESP8288-01是乐鑫公司推出的Wi-Fi模块,因为价格便宜迅速占领了市场,它可以做AT指令开发,也可以做 ...

  2. MVC和WebApi路由机制比较

    1.MVC使用的路由 在MVC中,默认路由机制是通过解析url路径来匹配Action.比如:/User/GetList,这个url就表示匹配User控制器下的GetList方法,这是MVC路由的默认解 ...

  3. 相对于Statement,PreparedStatement的优点是什么?

    优点: 1.PreparedStatement有助于防止SQL注入,因为它会自动对特殊字符转义. 2.PreparedStatement可以用来进行动态查询. 3.PreparedStatement执 ...

  4. 基于MongoDB权限管理+gridfs文件上传------云盘系统

    学了一会Mongo,开始毕设的编写. 毕设目前一共分为如下模块 用户管理模块 管理员管理模块 文件管理模块 分享模块 目前已经完成了权限管理部分的后端代码.上传下载已经实现Demo.先把权限弄好后在整 ...

  5. 基于jupyter lab搭建网页编程环境并添加自定义python kernel和matlab kernel以及plotly的使用

    内容转载自我的博客 目录 说明 1. 创建虚拟环境jupyter 2. 安装nodejs(用于jupyterlab安装扩展) 3. 安装pip包 4. 使用jupyterlab 5. 配置jupyte ...

  6. HDFS 修改默认副本数

    描述:将HDFS副本数修改为2第一步:将HDFS上已有文件副本数修改为2 hdfs dfs -setrep 2 -R -w / 第二步:修改dfs.replication值为2(页面上操作),然后重启 ...

  7. ICPC Central Russia Regional Contest (CRRC 19)题解

    题目连接:https://codeforces.com/gym/102780 寒假第二次训练赛,(某菜依旧是4个小时后咕咕咕),战况还行,个人表现极差(高级演员) A:Green tea 暴力枚举即可 ...

  8. 如何构建一个多人(.io) Web 游戏,第 1 部分

    原文:How to Build a Multiplayer (.io) Web Game, Part 1 GitHub: https://github.com/vzhou842/example-.io ...

  9. 怎么启用apache的mod_log_sql模块将所有的访问信息直接记录在mysql中

    怎么启用apache的mod_log_sql模块将所有的访问信息直接记录在mysql中

  10. kubernets之服务的实现方式

    一  服务如何通过kubernetes集群的组件来实现其功能 1.1  节点上的所有的服务相关的功能实现都是通过节点上面的kube-proxy来实现的,服务提供了一个或者多个服务IP以及端口对客户端开 ...