首先看any类型
let val:any
let val_any:any = val;
let val_unknown:unknown = val;
let val_void:void = val;
let val_undefined:undefined = val;
let val_null:null = val;
let val_number:number = val;
let val_string:string = val;
let val_boolean:boolean = val;
val = '';
val = 1;
val = true;
val = null;
val = undefined;
然后看看unknown类型
let val: unknown;
let val_any:any = val;
let val__unknown:unknown = val;
let val_string:string = val;
let val_number:number = val;
let val_boolean:boolean = val;
let val_null:null = val;
let val_undefined:undefined = val;
val = '';
val = 0;
val = true;
val = undefined;
val = null;
val = void;
val = any;
val = unknown;
val = never;
代码规范,any虽然可以代表任意类型,但是能不用就不要用,这是默认的代码规范问题,不要用成anyscript!
与any任意类型相比,因为unknown是未知类型,所以只能进行!!,!,?,typeof,instanceof等有限操作
2. 数组和元组的区别
如果数组的类型在[]前面,那么表示该数组全部都是该类型
如果数组的类型在[]内部(严格限制类型和长度的元组),那么表示该数组的第x个元素是该类型
首先,数组的类型在[]前面
let arr:(number | string)[] = ['s',3,'a'];
let arr:any[] = ['a',2,true];
此时来看看数组的类型在[]内部的用法,此时就是
let arr:[number] = [2];
let arr:[string,number] = ['a',1];
let arr:[any,any,any] = ['s',2,true];
其实[string,boolean]这种声明形式指的是元组,也就是一个已知元素数量和类型的数组
3.索引签名和工具类型Record的区别
其实Record工具类型的本质就是索引签名,不同之处只是用法,仅仅需要继承就可以了,不需要再写一遍
索引签名的用法
interface inf{
name:string;
age:number;
[k:string]:any;
}
let obj:inf = {
name:'yiye',
age:33,
city:'foshan'
}
Record工具类型的用法(ts内置的工具类型)
interface inf extends Record<string,any>{
name:string;
age:number;
}
let obj:inf = {
name:'yiye',
age:33,
city:'foshan'
}
Record工具类型的.d.ts声明文件源码是:
type Record<K extends keyof any, T> = {
[P in K]: T;
};
所以用法就是继承这个工具类型,然后泛型参数1是属性类型,参数2是属性值的类型
4.interface和type的区别
如果在开发一个包或者要被继承,那么使用接口interface
如果要定义基础数据类型或者进行类型运算,那么使用类型别名type
不同点1:interface可以进行声明合并,type不可以
interface union{
name:string;
}
interface union{
age:number;
}
let u = {} as union;
console.log(u.name);
console.log(u.age);
console.log(u.list);
不同点2:type可以直接进行赋值运算,而interface不可以,必须先继承
type type_a = number;
type type_sum = type_a | string;
interface inf_a{
name:string;
}
interface inf_b extends inf_a{
age:number;
}
let inf = {} as inf_b;
console.log(inf.age,inf.name);
不同点3:interface只可以用于对象和函数;type则可以用于对象,函数,基础类型,数组,元组
interface obj{
name:string;
}
interface func{
(x:string): number;
}
type type_obj = {name:string};
type type_func = (x:string) => string
type type_boolean = true;
type type_null = null;
type type_union = string | number;
type type_arr = number[];
type type_tuple = [number,string];
5.enum和const enum
enum可以进行反向查找,所以遍历得到的长度是预计长度的两倍
const enum不可以进行反向查找,所以得到的是预计长度
enum REVERSE{
OK,
NO
}
console.log(REVERSE.OK)
console.log(REVERSE[0])
console.log(REVERSE[1])
console.log(REVERSE[10])
for(let item in REVERSE){
console.log(item);
}
const enum ONE{
OK,
NO
}
console.log(ONE.OK)
1. 类型键入
type User = {
outer:string;
innerList:{
innerName:string
}[]
}
type userOut = User['outer'];
type userList = User['innerList'];
type userListItem = userList[number];
let item:userListItem = {
innerName:'yiye'
}
console.log(item)
2 装饰器
function fun() {
return function(target: any, key: string, descriptor: PropertyDescriptor) {
console.log(target);
console.log(key);
console.log(descriptor);
};
}
class A {
@fun()
getDecorator() {
console.log('测试');
}
}
let obj:A = new A();
obj.getDecorator();
3. typeof
typeof 关键字在 JS 中用来获取变量的类型,运算结果是一个字符串(值)。而在 TS 中表示的是推算一个变量的类型
let str_1 = 'hello'
console.log(typeof str_1);
type type_1 = typeof str_1;
let obj_1:type_1 = 'dd';
console.log(obj_1)
const str_2 = 'abc'
console.log(typeof str_2);
type type_2 = typeof str_2;
let obj_3:type_2 = 'abc';
interface person{
name:string,
age:number
};
let obj:person = {
name:'yiye',
age:11
}
console.log(typeof obj)
type type_obj=typeof obj;
function foo(key:string){
return key;
}
type type_func = typeof foo;
4.keyof
keyof关键字用来获取一个对象类型的所有key类型
type type_1 = {
id:number,
name:string
}
let key_1: keyof type_1 = 'id'
console.log(key_1);
function foo<T extends Object, K extends keyof T>(obj:T,key:K){
console.log(obj[key]);
}
interface key{
name:string,
age:number
}
let obj:key = {
name:'yiye',
age:11
}
foo(obj,'name');
foo(obj,'age');
由于本次改造的项目为一个通过NPM进行发布的基础服务包,因此本次采用TypeScript进行改造的目标是移除Babel全家桶,减小包体积,同时增加强
类型
约束从而避免今后开发时可能的
问题
。
本次改造
使用
的是TypeScript v2.9.2,采用Webpack v4.16.0进行打包编译。开发工具
使用
的是VSCode,
使用
中文语言包。预期目标是直接将TypeScript代码通过loader直接...
编译一个
ts
文件,开发react后缀 .
ts
x
命令:
ts
c hello.
ts
含义:将
ts
文件转成js文件,如果有
ts
语法错误,会报错,但是仍然会生成js文件,我们仍然可以
使用
这个js文件;
如果想要在报错的时候终止js的生成,可以在
ts
config.json中配置onEmiOnError即可
ts
只会在编译时对
类型
进行检查,如果发现错误,编译时就会报错;(静态检查)
而js是再运行时,发现错误,会报错;(动态检查)
3. 数据
类型
首先,我们需要知道string的如下特性:
1.字符串做参数,传递的是引用,只是一个指针的复制,你修改参数的指向,影响不到调用它的函数中的那个指针所指向的内容
2.字符串不可修改。你以任何一种形式修改了字符串(+,=等操作),源字符串其实还在的,只是根据你的修改重新生成了一个新的字符串
3.如果需要修改,两种方案,一是将修改后的字符串返回;二是作参数传字符串时
使用
ref 传递,这样子函数
原文:http://coolketang.com/staticCoding/5a9925ad0b61607bf6ceb390.html1. AnyObject可以代表任何class
类型
的实例。此外还有一个Any,它可以
表示
任何
类型
,除了方法
类型
。本节课将为你讲解Any的
使用
。 2. 定义一个Any
类型
的数组,该数组可以装载各种
类型
的数据。 3. 依次往数组中添加整型、浮点
类型
、字符串和元组
类型
四种...
1. 什么是 JavaScript 语言?
1.1 定义
JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”(script language),指的是它不具备开发操作系统的能力,而是只用来编写控制其他大型应用程序(比如浏览器)的“脚本”。
JavaScript 也是一种嵌入式(embedded)语言。它本身提供的核心语法不算很多,只能用来做一些数学和逻辑运算。
文章目录一、字符串的定义方式二、String注意
问题
三、内存分布(注意
问题
详解)1、分布方式12、分布方式23.分布方式3常量池四、练习
问题
问题
一:
问题
二:五、字符串不可变
一、字符串的定义方式
public static void main(String[] args) {
//这种方式赋
值
,和数组相同也是new了一个对象,直接赋
值
String str = "hello";
String str1 = new String("hello");