let [first, ...rest] = [1, 2, 3, 4];
console.log(first); // outputs 1
console.log(rest); // outputs [ 2, 3, 4 ] let [first] = [1, 2, 3, 4];
console.log(first); // outputs 1
----------------------------------------
对象解构:
let o = {
a: "foo",
b: 12,
c: "bar"
};
let { a, b } = o; let { a, ...passthrough } = o;
let total = passthrough.b + passthrough.c.length;
---------------------------------------
属性重命名:
let { a: newName1, b: newName2 } = o;
等价于:
let newName1 = o.a;
let newName2 = o.b; 这里的冒号不是指示类型的。 如果你想指定它的类型
let {a, b}: {a: string, b: number} = o;
let { a, b = 1001 } = o; //默认值 ----------------------------------------
函数申明解构:
type C = { a: string, b?: number }
function f( { a, b }: C ): void {
} function f( { a, b = 1 } = { a: "", b: 0 } ): void {
}
f(); // ok, default to { a: "", b: 0 }
-----------------------------------------------------------
interface 类型检查器不会去检查属性的顺序,编译器只会检查那些必需的属性是否存在,可以比接口规定的属性多。
interface X{
readonly a?:string; //一些对象属性只能在对象刚刚创建的时候修改其值
b?:number;
}
function ff(x:X):{a:string,b:number}{} //函数返回值规定类型
--------------------------------------------
只读属性:一些对象属性只能在对象刚刚创建的时候修改其值
interface Point {
readonly x: number;
readonly y: number;
}
let p1: Point = { x: 10, y: 20 };
p1.x = 5; // error! ReadonlyArray<T>类型,把所有可变方法去掉了,因此可以确保数组创建后再也不能被修改。
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!
上面代码的最后一行,可以看到就算把整个ReadonlyArray赋值到一个普通数组也是不可以的。 但是你可以用类型断言重写:a = ro as number[]; 最简单判断该用readonly还是const的方法是看要把它做为变量使用还是做为一个属性。 做为变量使用的话用 const,若做为属性则使用readonly。
----------------------------------
类静态部分与实例部分的区别:
类是具有两个类型的:静态部分的类型和实例的类型,类实现了一个接口时,只能够做到对其实例部分进行类型检查。 constructor存在于类的静态部分,所以不能检查。因此要检验类的构造函数不能用继承的方法,而是直接操作类的静态部分。
interface ClockConstructor { //用来检验构造函数
new (hour: number,s:string);
}
class DigitalClock{//校验构造函数不能用继承的方式, 也不再类的上面做操作,
constructor(h: number) { }
tick() {
console.log("beep beep");
}
}
var dd = new DigitalClock(2);//new 之前做检验
function createClock(ctor: ClockConstructor) { //而是在传参数的时候做校验
return new ctor(1);
}
let digital = createClock(DigitalClock, 12, 17);
----------------------------------------------------------------
接口继承类: 接口同样会继承到类的private和protected成员。接口里面的成员变量不能有访问修饰符、不能赋值、方法不能有访问修饰符和实现。 类里面没有方法的重载。有方法的重写。 子类必须调用super函数, super只能在构造函数中用, private只能在本类访问,不能在子类访问。protected可以在子类中访问。构造函数也可以被标记成protected,只能在子类实例化。
----------------------------------------------------------------
参数属性:
class Animal {
constructor(private name: string) { }
}
构造函数里使用private name: string参数来创建和初始化name成员。
----------------------------------------------------------------
接口里面方法没有{}。抽象类里面方法要有{}。抽象类中的抽象方法必须在子类实现。类没有构造函数也可以有实例。静态属性和方法在类内部也是通过类.访问。
--------------------------------
class A{
static abc = "abc";
def = "def";
gret(){
console.log(A.abc);
}
} let a = new A();
console.log(a.gret());//abc let a1 : typeof A = A;
a1.abc = "abc1"; let a3 = new a1();
a3.gret();//abc1
--------------------------------
js的参数是可传可不传的,ts的参数是一定要传的,函数的可选参数如果出现在最后面不传即可,如果出现在中间要传undefined才使用默认值。
--------------------------------
this: var suits = 4;
let deck = {
suits: 1,
createCardPicker: function() {
var suits = 3;
return function() {
var suits = 2;
return {suit: this.suits}; //return 出去,不带着当前this,而是出去之后的this,
}
}
} let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker(); console.log( pickedCard.suit ); // --------------------------
var suits = 4;
let deck = {
suits: 1,
createCardPicker: function() {
var suits = 3;
return () => {
var suits = 2;
return {suit: this};
}
}
} let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();
console.log( pickedCard.suit ); //1,箭头函数会绑定里面的this,出去之后也带着这个this,不会改变。箭头函数能保存函数创建时的 this值,而不是调用时的值 interface Card {
suit: string;
a:number;
}
interface Deck {
suits: string;
aa:number;
createCardPicker(this: Deck): (a:number) => Card; //这个函数的返回值是一个函数
}
interface D{
suits:number;
}
var suits = "suitssuits"; let deck : Deck = { //这个Deck校验deck,
suits: "hearts",
aa:333,
createCardPicker: function(this: D) { //校验调用createCardPicker方法的对象,
if(suits){
return (a:number) => {
return {suit: this.suits,a:123}; //"hearts"
}
}else{
return function(a:number) {
return {suit: this.suits,a:123}; //suitssuits
}
}
}
} let a = {s : deckDeck.createCardPicker,suits:333333334444444};
let s = a.s()
console.log( s(1).suit ); let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker(2);
alert( pickedCard.suit ); --------------------------------
class Foo {
x = 3;
print() {
console.log('x is ' + this.x);
}
} var f = new Foo();
f.print(); // Prints 'x is 3' as expected // Use the class method in an object literal
var z = { x: 10, p: f.print };
z.p(); // Prints 'x is 10' var p = z.p;
p(); // Prints 'x is undefined'
--------------------------------
泛型:function loggingIdentity<T extends Lengthwise>(arg: T): T {} 枚举: 通过字符串可以找到整数,通过整数也可以找到字符串。它包含双向映射(name -> value)和(value -> name)
enum FileAccess {
None,
Read = 1,
Write = 2,
ReadWrite = 9,
G = 123,
}
var FileAccess;
(function (FileAccess) {
FileAccess[FileAccess["None"] = 0] = "None";
FileAccess[FileAccess["Read"] = 1] = "Read";
FileAccess[FileAccess["Write"] = 2] = "Write";
FileAccess[FileAccess["ReadWrite"] = 9] = "ReadWrite";
FileAccess[FileAccess["G"] = 123] = "G";
})(FileAccess || (FileAccess = {})); ------------------------------------
类型兼容性:
interface i{
f:number;
s();
}
var f = {
f:1,
s:function () {},
ss:22,
};
function ff(x:i){ // f的属性比i多,只要能够全部赋值就可以了,所可以比目标对象的属性多
x.s();
}
ff(f);
----------------
函数赋值:
let x = (a: number) => 0;
let y = (b: number, s: string) => 0;
y = x; // OK,y函数要能够把x函数使用起来,y的参数要多于x
x = y; // Error 解析js:
var x = function (x) { return "x"; };
var y = function (x, y) { return '1'; };
x = y;
y = x;
------
let items = [1, 2, 3];
items.forEach((item, index, array) => console.log(item));
items.forEach((item) => console.log(item));
------
let x = () => ({name: 'Alice'});
let y = () => ({name: 'Alice', location: 'Seattle'});
x = y; // OK
y = x; // Error

TS3的更多相关文章

  1. typescript-学习使用ts-3

    函数 函数参数 参数及返回值类型 function add(x: number, y: number): number { return x + y } 可选参数 function add(x: nu ...

  2. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  3. CRL快速开发框架开源完全转到Github

    CRL简介 CRL是一款面向对象的轻量级ORM框架,本着快速开发,使用简便的原则,设计为 无需关心数据库结构,CRL自动维护创建,即写即用(CRL内部有表结构检查机制,保证表结构一致性) 无需第三方工 ...

  4. 快速开发框架CRL3.0发布,附带最新的项目示例CRLShoppingDemo

    继上次使用CRL实现大数据分库分表方案升级到2.4,时隔不久又升级到了大版本号3.0,主要是因为结构发生了一些更改 ORM和业务封装Package分开了,增加了实例项目演示代码CRLShoppingD ...

  5. 从配置读取一段时间(TimeSpan)

    C#的TimeSpan表示一段时间,DateTime表示一个时间点.TimeSpan可正可负,可与DateTime相加减,很方便,我喜欢. 代码中我们经常要表示一段时间,用一个统一的单位(时 或者 分 ...

  6. java从基础知识(七)java集合

    一.集合类介绍 1.List(元素有放入顺序,可重复) 1.1.List的实现 1.1.1.ArrayList ArrayList就是动态数组(需要连续的存储空间),用MSDN中的说法,就是Array ...

  7. Oracle分区

    可以参考文档:http://docs.oracle.com/cd/E18283_01/server.112/e16541/part_admin001.htm#insertedID0 (支持11g和12 ...

  8. axis2开发webservice程序

    一.环境 eclipse + jdk 6.0 + win7 64位 +tomcat7.0 二.创建服务端程序 1.新建web项目,webserviceTest 2.下载axis2,将lib目录下的ja ...

  9. 安卓初級教程(5):TabHost的思考

    package com.myhost; import android.os.Bundle; import android.view.LayoutInflater; import android.wid ...

随机推荐

  1. Codeforces Round #438 (Div.1+Div.2) 总结

    本来兴致勃勃的想乘着这一次上紫,于是很早很早的到了机房 但是好像并没有什么用,反而rating-=47 Codeforces Round #438(Div.1+Div.2) 今天就这样匆匆的总结一下, ...

  2. 同一sql程序执行比数据库执行慢

    最近项目发现同一个sql在java端执行比在数据库执行慢很多,原因可能是程序的sql参数类型与数据库字段的类型不一致.

  3. .net中的TreeView的数据绑定与EasyUi_tree的数据绑定

    昨天看到了.net中的TreeView,学习了一波TreeView的数据绑定,联想到EasyUi中的Tree的数据,觉得里面的逻辑差不多,就总结了一下两者的数据绑定. 前端页面和必要的JS如下 < ...

  4. SQL Server-聚焦过滤索引提高查询性能

    前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...

  5. solr 4.8+mysql数据库数据导入 + mmseg4j中文全文索引 配置笔记

    转载请标明出处:http://www.cnblogs.com/chlde/p/3768733.html 1.如何将solr部署,请参考之前的文章 2.按上述配置好后,在solr_home文件夹中,将包 ...

  6. TortoiseSvn问题研究(一)

    问题描述 今天在工作中遇到一个SVN方面的问题,牵扯出使用SVN这一段时间的一系列问题. 具体来说,是这样的: 上周五有上线分支,自己的分支需要merge: 很多项目小组都在开发这个项目,再往前好像也 ...

  7. Camera三维动画

    一.概述 在Android中说到3D开发,我们首先想到的是OpenGL,但用起来比较复杂繁琐,不适合做应用级别的3D变换.Android为我们提供了一个简化版的3D开发入口:Camera(这里的Cam ...

  8. linux下载命令wget

    Linux wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到 本地服务器.如果我们使用虚拟主机,处理这样 ...

  9. 爬虫工具--Beautifusoup

    import requests from bs4 import BeautifulSoup s=requests.Session() r=s.get('https://www.tumblr.com/l ...

  10. 序列模型(2)-----循环神经网络RNN

    一.RNN的作用和粗略介绍: RNN可解决的问题: 训练样本输入是连续的序列,且序列的长短不一,比如基于时间的序列:一段段连续的语音,一段段连续的手写文字.这些序列比较长,且长度不一,比较难直接的拆分 ...