进阶类型也是我自定义的,主要区别于上篇文章Typescript 基础类型。javascript
用来表示容许赋值为任意类型。java
场景:在编程阶段还不清楚类型的变量指定一个类型。好比来自用户输入或第三方代码库,咱们不但愿类型检查器对这些值进行检查而是直接让它们经过编译阶段的检查。那么任意值就派上用场了。git
// any.ts
let notSure: any = 1;
notSure = "换成字符串了";
notSure = false;
复制代码
编译后github
// any.js
var notSure = 1;
notSure = "换成字符串了";
notSure = false;
复制代码
任意值还有属性和方法,一块儿看下typescript
// anyAttr.ts
let anyAttr: any = 'typescript';
console.log(anyAttr.name);
console.log(anyAttr.name.firstName);
复制代码
编译后编程
// anyAttr.js
var anyAttr = 'typescript';
console.log(anyAttr.name);
console.log(anyAttr.name.firstName);
复制代码
// anyFn.ts
let anyFn: any = 'typescript';
anyFn.setName('ts');
anyFn.name.setName('name');
复制代码
编译后数组
// anyFn.js
var anyFn = 'typescript';
anyFn.setName('ts');
anyFn.name.setName('name');
复制代码
可推断,声明一个变量为任意值以后,对它的任何操做(属性和方法),返回的内容的类型都是任意值(就这么无限下去)。函数
问(猜):那指定了类型是
any
和什么类型都不指定是否是一个意思?oop
// anyNothing.ts
let anyNothing: any;
anyNothing = 'pr';
anyNothing = 30;
let anyNothing1;
anyNothing1 = '江湖再见';
anyNothing1 = 18;
复制代码
编译后post
// anyNothing.js
var anyNothing;
anyNothing = 'pr';
anyNothing = 30;
var anyNothing1;
anyNothing1 = '江湖再见';
anyNothing1 = 18;
复制代码
下个粗鲁的结论,就是同样的(变量在声明时未指定其类型,那就默认指定为任意值类型)。
表示永不存在的值的类型。使用场景有
// never.ts
// 返回 never 的函数必须存在没法达到的终点
function error(message: string): never {
throw new Error(message);
}
// 推断的返回值类型为 never
function fail() {
return error("有错");
}
// 返回 never 的函数必须存在没法达到的终点
function infiniteLoop(): never {
while (true) {
// doSomething
}
}
function log(): never {
console.log('日志')
}
function ok(): never {
return '一切正常';
}
复制代码
编译前
编译后
但仍是编译出来了
// never.js
// 返回 never 的函数必须存在没法达到的终点
function error(message) {
throw new Error(message);
}
// 推断的返回值类型为 never
function fail() {
return error("有错");
}
// 返回 never 的函数必须存在没法达到的终点
function infiniteLoop() {
while (true) {
// doSomething
}
}
function log() {
console.log('日志');
}
function ok() {
return '一切正常';
}
复制代码
表示非原始类型(也就是除 number
,string
,boolean
,symbol
,null
或 undefined
以外的类型)。
那下面例子说明,在使用 object
的时候,能够理解为 Object.createObj
这样使用。
// object.ts
declare function createObj(o: object): void;
createObj({ name: "typescript" });
createObj(undefined);
createObj(null);
createObj('ts');
createObj(30);
createObj(false);
复制代码
编译前
编译后
但仍是编译出来了
// object.js
createObj({ name: "typescript" });
createObj(undefined);
createObj(null);
createObj('ts');
createObj(30);
createObj(false);
复制代码
注:关键字
declare
是用来声明变量,在这里只是一个辅助,后面会有对它作详细说明。
通过测试,null
和 { name: "typescript" }
是对象,因此没有什么问题,undefind
也没问题,个人理解是它是任何类型的子类型(固然也是 object
的子类型)。至于剩下的 3 个有问题已经很明显了。
本想将数组类型和函数类型放在这里的,但考虑到如下两点,因此会单独整理成 2 篇内容。
不知正在阅读的你是否赞同个人这种思路和书写方式?请留言...