学typescript,首先肯定是看官方文档,http://www.typescriptlang.org,国内翻译网站:https://www.tslang.cn

说实话,这个文档看下去,是昏昏欲睡的感觉。只能作为手册查查

在这里推荐《从C#到TypeScript - 类型》,从c#看ts,对比学起来快些,这里就个人,做一些笔记,分享一下

TypeScript - 类型

一般强类型编程语言基础类型有byte,short,int,long,float,double,boolean,char

而typescript和js一样,而TypeScript和JavaScript一样,所有的数字都是double(双精度浮点数),都是用number表示,字符串都是string,其它都不差不多。这里跟php等弱类型语言差不多。

typescript联合类型与交叉类型

ts让我感到诡异的就是 联合类型,其实就是多个类型联合在一起,用|符号隔开

let sn: string | number = 'string, number' //这个类型既可以是string,又可以是number

更加迷惑的是,交叉类型(Intersection Types),交叉类型是将多个类型合并为一个类型。 Person & Serializable & Loggable同时是 Person 和 Serializable 和 Loggable。 就是说这个类型的对象同时拥有了这三种类型的成员。您将主要看到用于mixins的交集类型和其他不适合经典面向对象模具的概念

interface T1 {
  a: boolean;
  b: string;
}  
interface T2 {
  a: boolean;
  b: number;
}  
type T = T1 & T2;
  type Ta = T['a']; // boolean
type Tb = T['b']; // string & number
  
declare const t: T;
declare const t1: T1;
t['b'] = t1['b'];

typescript枚举

js没有enum枚举,ts做了补充,可以实现类似C# Flag特性

enum Action{
    add = 1,
    edit = 2,
    del = 4,
    all = add | edit | del
}
console.info(Action.add);  // 返回1
console.info(Action.add.toString());  // 返回1
console.info(Action[1]);  // 返回"add"
console.info(Action[3]);  // 返回undefined
console.info(Action.all); // 返回7
console.info(Action.all & Action.add) //返回1

对函数增加void(和java等语法类似),还有never,用来表示永远不会得到返回值

typescript变量声明

typesc和C#,swift 有点类似,和C/C++,java 风格不同,ts让IED有了写js有了类型安全语言的流畅感。

let name: string = `Gene`;
let age: number = 37;
let sentence: string = `Hello, my name is ${ name }.
let someValue: any = "this is a string"; //any 和C#的dynamic很相似,回归传统js模式
let strLength: number = (someValue as string).length; //类型断言
type newstring = string;
let str: newstring = 'aaa';

c++ java 声明变量一般如此

int sum(int n){
int total = 0;
//在for循环的条件语句内部定义变量i
for(int i=1; i<=n ;i++){
total += i;
}
return total;
}

java代码

public class Test {
    public static void main(String[] args) {
        int a = 123;
        byte b = (byte) a;//强制类型转换为byte
        string c = 'cc'
    }
}

swift代码(swift let 为常量,var为变量,js里面const为常量,let为区域变量,var为普通变量)

import Cocoa
var varA = 42 //类型推断 会被推测为 Int 类型
var varB:Float = 3.14159
var 你好 = "你好世界"
typealias Feet = Int //类型别名
var distance: Feet = 100 //可以通过别名来定义变量:

typescript interface

typescript interface 诡异的,不像opp经典java 接口,也不像C#

interface Selectable {
    readonly isSelected: boolean; //只读属性,实现接口的类也不一定需要readonly
    body?: any;//可选属性
}
class Control implements Selectable {
    isSelected : boolean;
}
let config: RequestConfig = {url: 'google.com'};//接口不需要类的支持 
//这种经常用在函数的参数上面,用来描述具体的参数,把具体的参数放到接口里,方便操作,也方便重构。
function Request(config: RequestConfig){}

接口可以多重继承其他接口,用的是extends

interface Editable {}
interface Deleteable {}
interface Changeable extends Editable, Deleteable {}

在C#等面向对象语言里面,接口如果没有类来实现的话是没有什么意义的,但在TypeScript里不一样,接口可以单独使用。这感觉特别鸡贼!

接口除了描述属性外,还可以用来描述函数,不过一个接口只能描述一个函数,描述时定义好参数和返回值即可。WTF,吐血!

interface CheckLogin {
    (name: string, pwd: string): boolean;
}
let check: CheckLogin = function(name: string, pwd: string): boolean {
    return false;
}

接口还可以用来描述可索引类型,就有点类似C#的Dictionary。

索引支持两种:number和string。

//定义一个Dict,key是string,value也是stringinterface Dict {
    [key: string] : string;
}let dict: Dict = { 'key1': 'value1', 'key2': 'value2'};
console.info(dict['key1']); // value1console.info(dict['key']); // undefined

接口继承类

接口居然还可以反过来继承类,不过对于JavaScript里来说,灵活方便很重要,所以TypeScript实现了这个功能来快速生成一个接口。对我来说,觉得简直是反人类。颠覆opp的三观!因为复杂的继承通常会引入一些问题如紧耦合,牵一发而动全身,再加上这个,可能更让人摸不着头脑,不如用组合来得好。

typescript的类和java类C#类差不多

修饰类中属性、方法修饰符:

Java: public、protected、default、 private, 默认:default

C#:   public、protected、internal、private, 默认:private

ts:       public、protected、private,               默认:public。

TypeScript - function

TypeScript的参数和JavaScript的参数不太一样,调用JavaScript函数的参数可以多或少都可以,但TypeScript里函数需要确保传入参数的个数和定义的一致。

function checkLogin(name: string, pwd: string, isAdmin: boolean = false, email?: string){    console.info(isAdmin);
}checkLogin('brook'); // 编译不了
checkLogin('brook', '123456'); // false
checkLogin('brook', '123456', undefined); // false
checkLogin('brook', '123456', false); // false
checkLogin('brook', '123456', true, 'brook@email.com'); // true function checkLogin2(name: string, pwd: string, ...others: string[]){    console.info(others.join(' '));
}
checkLogin2('brook', '123456', 'brook@email.com', `12800`); // brook@email.com 12800

TypeScript es6- Reflect&&Proxy

Symbol、Reflect 和 Proxy 是属于 ES6 元编程范畴的,能“介入”的对象底层操作进行的过程中,并加以影响。元编程中的 元 的概念可以理解为 程序 本身。推荐阅读《ES6 元编程(Proxy & Reflect & Symbol)》 《ES6黑科技实践--proxy,reflect

怎么理解reflect

通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。对于Java来说,程序中一般的对象的类型都是在编译期就确定下来的,而Java反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。

而对于js来说自然是有些不同了。毕竟js不需要编译,同时万物皆对象的特性,这些都让理解js的reflect起来相当简单。

对于JS中的reflect,我们就可以理解为:有这么一个全局对象,上面直接挂载了对象的某些特殊方法,这些方法可以通过Reflect.apply这种形式来使用,当然所有方法都是可以在 Object 的原型链中找到的。是不是相当简单。

class Test{
    constructor(age: number){
        this.age = age;
    }     private _age: number;     get age(): number{
        return this._age;  // this 会被receiver代替
    }     set age(value: number) {
        this._age = value; // this 会被receiver代替
    }
} class Receiver{
    _age: number = 2;
} let t = new Test(1);
let r = new Receiver(); console.info(Reflect.get(t, "_age")); // 1, 获取t的_age值
console.info(Reflect.get(t, "age")); // 1, 获取t的age值
console.info(Reflect.set(t, "age", 3)); // true, 成功设置age值为3
console.info(Reflect.get(t, "age")); // 3, 再次获取t的age值
console.info(Reflect.get(t, "age", r)); // 2, 表面上是t的age,但实际上获取的是r的age
console.info(Reflect.set(t, "age", 3, r)); // true, 表面上是设置t的age, 实际上是设置r的age值为3
console.info(Reflect.get(r, "_age")); // 3, 直接获取r的_age
console.info(Reflect.apply(t["age"], t, 3));

proxy

let obj = { name: 'brook' };let p = new Proxy(obj, {
    get(target, property){        return 'cnblogs';
    }
});console.info(obj.name); // brookconsole.info(p.name); // cnblogs

一个使用proxy和reflect实现监听对象的小例子

// onChange 即要进行的监听操作
module.exports = (object, onChange) => {
    const handler = {
        get(target, property, receiver) {
            try {
                return new Proxy(target[property], handler);
            } catch (err) {
                return Reflect.get(target, property, receiver);
            }
        },
        defineProperty(target, property, descriptor) {
            onChange();
            return Reflect.defineProperty(target, property, descriptor);
        },
        deleteProperty(target, property) {
            onChange();
            return Reflect.deleteProperty(target, property);
        }
    };     return new Proxy(object, handler);
};

哎,前端的框架,不知道尽头,学学佛,降低下戾气!

——华丽分割线——

网友:请问佛教怎么祈求?

学诚法师:佛教的祈求,意思是:把自己需要的东西向佛菩萨报告,不是向泥塑木雕祈求,而是向佛像所代表的佛菩萨的法身祈求,让自己的所思所想与佛菩萨的心相应,这样面对境界就会有力量。祈求自己能有勇气面对一切困难,祈求自己能有信心坚定一切善法,祈求自己能有智慧洞察一切真相,祈求自己能有慈悲对待一切众生,祈求自己永远不要放弃自己,也永远不要放弃别人。

学诚法师:佛菩萨对众生的护佑并不是帮助我们得到理想的结果,而是指示出业果之道。

网友:今天是某市千僧颂经斋宴的好日子,尽管各地又雨又雾,这里却是阳光普照!既有祈求平安衣食无忧的普通人、亦有祈求升官发大财的达官贵人,那么请问,佛祖观音会让他们都如愿吗?

学诚法师:佛菩萨对众生的加持,就如同向导为迷途之人指路、医生为病人开药一样,能否得到利益,要看自己是否依照指示去行路、是否遵医嘱服药,一切都遵循业果法则的规律。

转载本站文章《typescript参照C#/java/swift学习小结》,
请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/typescript/2014_0306_6074.html

typescript参照C#/java/swift学习小结的更多相关文章

  1. Java: IO 学习小结

    源: 键盘 System.in 硬盘 FileStream 内存 ArrayStream 目的: 控制台 System.out 硬盘 FileStream 内存 ArrayStream 处理大文件或者 ...

  2. [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  3. Java Web 学习路线

    实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...

  4. objective-c基础教程——学习小结

    objective-c基础教程——学习小结   提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...

  5. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  6. Java Web学习系列——Maven Web项目中集成使用Spring

    参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...

  7. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  8. Java IO学习笔记:概念与原理

    Java IO学习笔记:概念与原理   一.概念   Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...

  9. 点滴的积累---J2SE学习小结

    点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...

  10. 20165310_获奖感想与Java阶段性学习总结

    获奖感想与Java阶段性学习总结 一.Learning By Doing ​ 在此之前,其实我并没有想到能够成为小黄杉的第一批成员之一,喜悦之余,也感受到了许多的压力.小黄杉一方面代表了老师对于我这一 ...

随机推荐

  1. JVM是如何处理反射的

    反射实现1-调用本地方法 例: 1 // v0版本 2 import java.lang.reflect.Method; 3 4 public class Test { 5 public static ...

  2. 容器中sh脚本明明存在,为何会报"no such file or directory"的错误?

    小伙伴碰到一起奇怪的事故,从gitlab上拉取的docker镜像项目,在本地开发机上进行docker build后,启动容器会报错如下: exec /app/run.sh : no such file ...

  3. 可怕!.Net 8正式发布了,.Net野心确实不小!

    随着三天.NET Conf 2023的会议结束了,.Net 8正式发布了. .Net 8是官方号称有史以来性能最快的一个版本了. .Net 8 增加了数以千计的性能.稳定性和安全性改进,以及平台和工具 ...

  4. 升级到 Pulsar3.0 后深入了解 JWT 鉴权

    背景 最近在测试将 Pulsar 2.11.2 升级到 3.0.1的过程中碰到一个鉴权问题,正好借着这个问题充分了解下 Pulsar 的鉴权机制是如何运转的. Pulsar 支持 Namespace/ ...

  5. C语言已知四位数3025具有一个特殊性质:它的前两位数字30与后两位数字25之和是55,而55的平方正好等于3025。编程找出所有具有这种性质的四位数。

    #include<stdio.h> void main() { int n, i, j; for (n = 1000; n < 10000; n++) { i = n / 100; ...

  6. swiper轮播图出现疯狂抖动(小程序)

    swiper轮播图息屏一段时间或快速滑动切换时出现疯狂抖动 以前做小程序项目的时候,没专门测试人员,都是开发者自测,可能我的手机性能比较不错(哈哈)或时机不对,总之没发掘到这个bug:近期做项目,测试 ...

  7. Go:条件控制语句

    在 Go 语言中,主要的条件控制语句有 if-else.switch 和 select.以下是对它们的简单介绍: 1. if 语句: if 语句用于根据条件执行不同的代码块.它的基本形式如下: if ...

  8. [ABC265D] Iroha and Haiku (New ABC Edition)

    Problem Statement There is a sequence $A=(A_0,\ldots,A_{N-1})$ of length $N$. Determine if there exi ...

  9. 《深入理解 FFmpeg》第一章彩色插图汇总

    layout: post title: "<深入理解 FFmpeg>第一章彩色插图" tags: - "FFmpeg" 这是<深入理解 FFm ...

  10. vmware虚拟机 linux 本地yum源,网卡配置ens33,防火墙selinux

    1.挂载镜像文件,CentOS-7-x86_64-DVD-1804.iso,并且要处于连接状态 #光盘挂载至/mntmount /dev/sr0 /mnt #备份yum源文件cd /etc/yum.r ...