在介绍变量声明、基本数据类型、泛型之前我们来先了解一下typescript
1、什么是typescript?
TypeScript简称TS。
TS和JS之间的关系其实就是Less/Sass和CSS之间的关系。
就像Less/Sass是对CSS进行扩展一样, TS也是对JS进行扩展。
就像Less/Sass最终会转换成CSS一样, 我们编写好的TS代码最终也会换成JS。
TypeScript是JavaScript的超集,因为它扩展了JavaScript,有JavaScript没有的东西。
硬要以父子类关系来说的话,TypeScript是JavaScript子类,继承的基础上去扩展。
2、为什么要使用 typescript?
1) 简单来说就是因为JavaScript是弱类型, 很多错误只有在运行时才会被发现
而TypeScript提供了一套静态检测机制, 可以帮助我们在编译时就发现错误。
2) 支持诸如C,C++,Java,Go等后端语言中的特性 (枚举、泛型、类型转换、命名空间、声明文件、类、接口等)
在我们了解typescript之后我们来了解下typescript中的变量声明、类型、和泛型
1、变量声明
2)声明变量的类型,但没有初始值,变量值会设置为 undefined:
4)声明变量没有设置类型和初始值,类型可以是任意类型,默认初始值为 undefined:
var uname:string = "lilei";
var score1:number = 50;
var score2:number = 42.50
var sum = score1 + score2
console.log("名字: "+uname)
console.log("第一个科目成绩: "+score1)
console.log("第二个科目成绩: "+score2)
console.log("总成绩: "+sum)
1)八种内置类型
const str: string = ‘中国万岁’;
const num: number = ‘666’;
const bool: boolean = true;
const u: undefined = undefined;
const n: null = null;
const big: bigint = 100n;
const sym: symbol = Symbol(‘me‘);
const obj: object = {x: 1};
元祖类型 Tupl
注意:
-
null 和 undefined
默认情况下
null
和undefined
是所有类型的子类型,可以把null
和undefined
赋值给其它任何类型:// null 和 undefined 赋值给 number let num: number = 1; num = null; num = undefined; // null 和 undefined 赋值给 boolean let bool: boolean = false; bool = null; bool = undefined; // null 和 undefined 赋值给 object let obj: object = {}; obj = null; obj = undefined; 复制代码
如果在
tsconfig.json
里配置了"strictNullChecks": true
,null
就只能赋值给any
、unknown
和它本身的类型(null),undefined
就只能赋值给any
、unknown
、void
和它本身的类型(undefined)。number 和 bigint
虽然
number
和bigint
都表示数字,但是这两个类型并不兼容,比如下文会报错:let big: bigint = 100n; let num: number = 1; num = big; // Type 'bigint' is not assignable to type 'number'
元祖类型 Tupl
-
众所周知,数组一般由同种类型的值组成,但有时我们需要在单个变量中存储不同类型的值,这时候我们就可以使用元组。在 JavaScript 中是没有元组的,元组是 TypeScript 中特有的类型,其工作方式类似于数组。
-
// [string, number] 就是元组类型。数组 x 的类型必须严格匹配,且个数必须为2
let x: [string, number];x = [‘Hi’, 666]; // OK
x = [666, ‘Hi’]; // error
x = [‘Hi’, 666, 888]; // error -
在定义元组类型时,我们也可以通过
?
来声明元组类型的可选元素:// 要求包含一个必须的字符串属性,和一个可选的布尔值属性 let arr: [string, boolean?]; arr = ['一个能打的都没有', true]; console.log(arr); // ['一个能打的都没有', true] arr = ['如果暴力不是为了杀戮']; console.log(arr); // ['如果暴力不是为了杀戮'] 复制代码
元组类型里最后一个元素可以是剩余元素,形式为
...x
,你可以把它当作 ES6 中的剩余参数。剩余元素代表元组类型是开放的,可以有0个或者多个额外的元素。例如,[number, ...string[]]
表示带有一个number
类型的元素和任意数量string
类型的元素的元组类型。举个栗子:let arr: [number, ...string[]]; arr = [1, '赵信']; // ok arr = [1, '赵信', '吕布', '亚索']; // ok
-
空类型 void
void
表示没有任何类型,和其他类型是平等关系,不能直接赋值:
let a: void;
let b: number = a; // Error
复制代码
你只能为它赋予null
和undefined
(在strictNullChecks
未指定为true时)。声明一个void
类型的变量没有什么大用,我们一般也只有在函数没有返回值时去声明。
值得注意的是,方法没有返回值将得到undefined
,但是我们需要定义成void
类型,而不是undefined
类型。否则将报错:
function fun(): undefined {
console.log("this is TypeScript");
};
fun(); // Error
any类型
在 TS 中,任何类型都可以被归为any
类型,any
类型是类型系统的顶级类型。
如果是一个普通类型,在赋值过程中改变类型是不被允许的:
let a: string = '伊泽瑞尔,你需要地图吗?';
a = 666; // Type 'number' is not assignable to type 'string'
复制代码
let a: any = 666;
a = '哈哈哈';
a = false;
a = null;
a = undfined;
a = [];
a = {};
复制代码
如果变量在声明的时候,未指定其类型,那么它会被识别为any
类型:
let something;
something = '啦啦啦';
something = 888;
something = false;
复制代码
等价于:
let something: any;
something = '啦啦啦';
something = 888;
something = false;
复制代码
使用any
类型就失去了使用TS
的意义,长此以往会放松我们对自己的要求,尽量不要使用any
。
enum
类型是对JavaScript标准数据类型的一个补充。 像C#等其它语言一样,使用枚举类型可以为一组数值赋予友好的名字。
// 默认情况从0开始为元素编号,也可手动为1开始
enum Color {Red = 1, Green = 2, Blue = 4}
let c: Color = Color.Green;
let colorName: string = Color[2];
console.log(colorName); // 输出'Green'因为上面代码里它的值是2
复制代码
软件工程的一个主要部分就是构建组件,构建的组件不仅需要具有明确的定义和统一的接口,同时也需要组件可复用。支持现有的数据类型和将来添加的数据类型的组件为大型软件系统的开发过程提供很好的灵活性。
在C#
和Java
中,可以使用”泛型“来创建可复用的组件,并且组件可支持多种数据类型。这样便可以让用户根据自己的数据类型来使用组件。
function gen_func1<T>(arg: T): T {
return arg;
}
// 或者
let gen_func2: <T>(arg: T) => T = function (arg) {
return arg;
}
复制代码
调用方式也有两种:
gen_func1<string>('Hello world');
gen_func2('Hello world');
// 第二种调用方式可省略类型参数,因为编译器会根据传入参数来自动识别对应的类型。
复制代码
2) 泛型与Any
Ts
的特殊类型 Any
在具体使用时,可以代替任意类型,咋一看两者好像没啥区别,其实不然:
// 方法一:带有any参数的方法
function any_func(arg: any): any {
console.log(arg.length);
return arg;
}
// 方法二:Array泛型方法
function array_func<T>(arg: Array<T>): Array<T> {
console.log(arg.length);
return arg;
}
复制代码
- 方法一,打印了
arg
参数的length
属性。因为any
可以代替任意类型,所以该方法在传入参数不是数组或者带有length
属性对象时,会抛出异常。 - 方法二,定义了参数类型是
Array
的泛型类型,肯定会有length
属性,所以不会抛出异常。
3)泛型类型
泛型接口:
interface Generics_interface<T> {
(arg: T): T;
}
function func_demo<T>(arg: T): T {
return arg;
}
let func1: Generics_interface<number> = func_demo;
func1(123); // 正确类型的实际参数
func1('123'); // 错误类型的实际参数
原文地址:https://blog.csdn.net/weixin_49354517/article/details/124423659
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_31372.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!