从C#到TypeScript - 类型

从C#到TypeScript - 类型

TypeScript和C#一样是微软搞出来的,而且都是大牛Anders Hejlsberg领导开发的,它们之间有很多共同点,现在尝试以C#程序员的角度来理解下TypeScript。 TypeScript一门是JavaScript的超集语言,除了支持最新的JS语法外,TypeScript还会增加一些其他好用的语法糖,最重要的是它在兼顾JavaScript灵活的基础上增加了强类型系统,这样更友好的支持开发大型系统。

现在来看下TypeScript基础类型:

数值

C#的数字类型有好几种:int, long, float, double, byte等,而TypeScript和JavaScript一样,所有的数字都是浮点数,都是用number表示,这样也省了很了事,少了C#里类似longint overflow问题。

下面用不同进制方式显示数字20。

let num = 20;       // 10进制
let num = 0xa4;     // 16进制
let num = 0b10010;  // 2进制
let num = 0o24;     // 8进制

布尔

boolean,和C#的功能一样,不多说。

let isCheck: boolean = true;

枚举

enum,大家都知道javascript没有enum,这也是TypeScript为此作的补充。功能上和C#差不多:

  1. 目的都是为数值提供一个友好的名字,增加代码可读性和可重构性
  2. 默认情况下从0开始编号
  3. 也可以手动赋值
  4. 可以实现类似C# Flag特性 但也有一些细节不一样:
  5. C#的枚举值toString()会返回枚举的文本值,而TypeScript是数值
  6. TypeScript可以通过数值下标取得枚举字符串值
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

上面的Action编译成JavaScript的结果:

var Action;
(function (Action) {
    Action[Action["add"] = 1] = "add";
    Action[Action["edit"] = 2] = "edit";
    Action[Action["del"] = 4] = "del";
    Action[Action["all"] = 7] = "all";
})(Action || (Action = {}));

字符串

字符串也基本和C#一样,不过由于是JavaScript的超集,所以当然也支持单引号。 C#6.0里的模板字符串语法糖$"this is {name}'s blog"在TypeScript里也有类似的支持,当然,这也是ES6的规范。

let name: string = 'brook';
let note: string = `this is ${name}'s blog`;

Symbol

这也是ES6的特性,用来当作唯一的标识,所有新建出来的Symbol都是不同的,不管传进去的值是否一样。 Symbol非常适合做唯一key。

let key1 = Symbol('key');
let key2 = Symbol('key');

console.info(key1 === key2); // return false

any

这个和C#的dynamic很相似,可以代表任何东西且在上面调用方法或属性不会在编译时期报错,当然也本来就是JavaScript最基本的东西。

let test: any = 'test';
test = false;

test.test(); //编译时期不会有报错
let arr: any[] = ['test', false];

void、null、undefined和never

void和C#的一样,表示没有任何东西。 nullundefined和JavaScript一样,分别就是它们自己的类型,个人觉得这两者功能有点重合,建议只使用undefinednever是TypeScript引进的,个人觉得是一种语义上的类型,用来表示永远不会得到返回值,比如while(true){}throw new Error()之类。

function test(): void{} //  void
let a: string = null; let b: null = null; // null有自己的类型,并且默认可以赋值给任何类型(除never之外),可用--strictNullChecks标记来限制这个功能
let a: string = undefined;  let b: undefined = undefined; // undefined, 同上
function error(): never{ // never
    throw new Error('error');
}

数组

有基本的数组:

let arr: string[] = ['a', 'b', 'c'];

也有类似C#的泛型List

let list: Array<string> = ['a', 'b', 'c'];

数组功能没C#配合linq那么强大,不过配合其他一些库如lodash也可以很方便的进行各种操作。 数组还可以利用扩展操作符...来把数组解开再放入其他数组中。

let arr: number[] = [1, 2, 3];
let newArr: number[] = [...arr, 4, 5];
console.info(newArr); // 1, 2, 3, 4, 5

元组

C#也有个鸡肋的Tuple,不好用,不过新版的Tuple好像已经在C#7.0的计划当中。 下面这段代码是C#7.0的,真方便,不用再new Tuple<>,item1, item2之类的。

(string first, string middle, string last) LookupName(long id)
{
    return (first:'brook', middle:'', last:'shi');
}

var name = LookupName(id);
console.WriteLine(`first:${name.first}, middle:${name.middle}, last:${name.last}`);

TypeScript里的也不输给C#,不过叫法上是分开的,这里的元组只是对数组的处理,另外还有对象上的叫解构赋值,以后会写。

let tuple: [number, string] = [123, '456'];
let num = tuple[0]; //num
let str = tuple[1]: //string

tuple[3] = '789'; //可以,越界后会以联合类型来判断,后面会讲联合类型
tuple[4] = true; //不行

这一篇主要就讲这些基本类型,下一篇会讲TypeScript的高级类型

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

最常见的 35 个 Python 面试题及答案(2018 版)

作为一个 Python 新手,你必须熟悉基础知识。在本文中我们将讨论一些 Python 面试的基础问题和高级问题以及答案,以帮助你完成面试。包括 Python ...

983
来自专栏Java爬坑系列

C++指针类型识别正确姿势

  指针是C和C++中编程最复杂也是最有技巧的部分,但对于新手来说,指针无疑是最致命的,让很多人望而退步。不过很多事情都是从陌生开始,然后渐渐熟悉起来的,就像交...

1657
来自专栏北京马哥教育

Python编程中的反模式

云豆贴心提醒,本文阅读时间7分钟 这篇文章收集了我在Python新手开发者写的代码中所见到的不规范但偶尔又很微妙的问题。 本文的目的是为了帮助那些新手开发者渡...

3347
来自专栏机器学习算法与Python学习

10个Python面试常问的问题

源 | segmentfault,小象学院 文 | xiaochao 概述 Python是个非常受欢迎的编程语言,随着近些年机器学习、云计算等技术的发展...

4249
来自专栏Aloys的开发之路

不引入新的数组,实现数组元素交换位置函数

         最近遇到一道C++的面试题,要求不引入新的数组,实现数组元素交换位置函数,看似挺简单的,却还是花费了我不少时间,这里记录下来,给大家一个简单的...

1888
来自专栏猿人谷

浅谈C/C++中的指针和数组(一)

                                                       浅谈C/C++中的指针和数组(一)       指...

1965
来自专栏企鹅号快讯

轻松初探Python(六)—函数

这是「AI 学习之路」的第 6 篇,「Python 学习」的第 6 篇 题外话 这周工作日 5 天,我并没有更新文章,但大家并不要以为小之懒惰了。正好相反,自从...

1759
来自专栏鸿的学习笔记

python稍难一点的说明

522
来自专栏苦逼的码农

从0打卡leetcode之day 5 ---两个排序数组的中位数

最简单粗暴的就是把这两个数组头尾连接起来,然后重新给他们排序一下,冒泡排序相信你信手拈来,当然,你也可以装逼用快速排序。

721
来自专栏WeaponZhi

轻松初探Python(六)—函数

这是「AI 学习之路」的第 6 篇,「Python 学习」的第 6 篇 题外话 这周工作日 5 天,我并没有更新文章,但大家并不要以为小之懒惰了。正好相反,自从...

3327

扫码关注云+社区