Ts高级类型(Utility Types)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ts高级类型(Utility Types)相关的知识,希望对你有一定的参考价值。

参考技术A

学习TypeScript的过程中发现对某些UtilityTypes不是很理解,就重新在文档上系统学习了一遍,TypeScript提供了几种实用工具类型来促进常见的类型转换,这些实用程序是全局可用的。

UtilityTypes文档链接: https://www.typescriptlang.org/docs/handbook/utility-types.html

将泛型传入的T中所有属性转换为可选属性,返回的类型可以是T的任意子集。

源码:

keyof T 获取T中的key值组合,这里的例子T是Person相当于是\'name\' | \'age\', in关键字遍历keyof返回值为新的类型新增了name和age属性,?操作符将所有属性定义为可选属性。

将泛型传入的T中所有属性转换为必须属性,和Partial类型相反。

源码:

和Partial相反,通过-?操作符将所以可选属性去除。

将泛型传入的T中所有属性转换为只读属性。

源码:

使用readonly关键字将所有属性变成只读属性。

创建一个对象类型,使对象的键key的类型为传入的泛型K,使对象的值value的类型为传入的泛型T。

源码:

通过传入的泛型T中选择一组属性K(字符串字面值或字符串字面值的联合)来构造类型。

源码:

规定了泛型K必须是泛型T中key的子集,上面例子中K必须是‘title’|‘description’|‘completed’

通过传入的泛型T中选择一组属性K并删除其他属性,和Pick相反。

源码:

结合了Pick和Exclude,使用Exclude排除掉T中除了包含K的所有属性,使用Pick重新创建一个新的类型。

从函数类型T的形参中使用的类型构造元组类型,可以用来获取一个函数里面参数的类型,不过注意是用元组的形式获取。

源码:

获取函数类型T返回值的类型。

源码:

TS2688:找不到安装了 @types/node 的“节点”的类型定义文件

【中文标题】TS2688:找不到安装了 @types/node 的“节点”的类型定义文件【英文标题】:TS2688: Cannot find type definition file for 'node' with @types/node installed 【发布时间】:2018-06-05 10:14:09 【问题描述】:

我很难在 Heroku 上构建 TypeScript 应用程序。

我的依赖项列表包括我正在使用的所有包的类型定义:

"dependencies": 
    "@nestjs/common": "^4.5.1",
    "@nestjs/core": "^4.5.1",
    "@nestjs/microservices": "^4.5.1",
    "@nestjs/testing": "^4.5.1",
    "@nestjs/websockets": "^4.5.1",
    "@types/express": "^4.0.39",
    "@types/jest": "^21.1.8",
    "@types/json-schema": "^6.0.0",
    "@types/jsonwebtoken": "^7.2.5",
    "@types/mongoose": "^4.7.29",
    "@types/node": "^8.5.1",
    "@types/passport": "^0.4.2",
    "@types/passport-jwt": "^3.0.0",
    "@types/supertest": "^2.0.4",
    "chalk": "^2.3.0",
    "dotenv": "^4.0.0",
    "express-jwt": "^5.3.0",
    "global": "^4.3.2",
    "jsonwebtoken": "^8.1.0",
    "mongoose": "^4.13.7",
    "passport": "^0.4.0",
    "passport-jwt": "^3.0.1",
    "redis": "^2.8.0",
    "reflect-metadata": "^0.1.10",
    "rxjs": "^5.5.5",
    "tslint": "^5.8.0",
    "ts-node": "^4.0.2",
    "typescript": "^2.6.2"
  ,

但是,在 Heroku 上构建时,我得到:

error TS2688: Cannot find type definition file for 'node'
error TS2307: Cannot find module 'http'

等等。我的 tsconfig.json 将 typeRoots 设置为 './node_modules/@types' 并且我在本地成功构建。

为什么 Heroku 找不到这些类型?

【问题讨论】:

【参考方案1】:

显然 Heroku 没有对我的 package.json 文件进行更改,或者缓存了构建过程的某些部分,这些部分排除了我从 devDependencies 移动到依赖项的 @type 定义。

我这样清除了构建缓存:

$ heroku plugins:install heroku-repo
$ heroku repo:purge_cache -a [appname]
$ git commit --allow-empty -m "Purge cache"
$ git push heroku master

一切都按预期进行。

【讨论】:

以上是关于Ts高级类型(Utility Types)的主要内容,如果未能解决你的问题,请参考以下文章

在 PLSQL 中查找 dbms_utility.lname_array 类型的 2 个数组之间的差异

我收到一个错误“传播类型只能从对象 types.ts(2698) 创建”

TS2688:找不到安装了 @types/node 的“节点”的类型定义文件

utility 在计算机中是啥意思?

对于 Node.js 项目中的 TS 类型,@types/core-js 是不是仍然必要?

@types/react-transition-group:通用类型 'ReactElement<P, T>' 需要 1 到 2 个类型 arguments.ts(2707)