TypeScript 开发实战
梁宵
搜狗营销事业部高级架构师
34174 人已学习
新⼈⾸单¥59
课程目录
已完结/共 47 讲
TypeScript 开发实战
登录|注册
留言
9
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 21 | 高级类型(4):条件类型
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 重塑“类型思维”
02 | 类型基础(1):强类型与弱类型
03 | 类型基础(2):动态类型与静态类型
04 | 编写你的第一个TypeScript程序
05 | 基本类型
06 | 枚举类型
07 | 接口(1):对象类型接口
08 | 接口(2):函数类型接口
09 | 函数相关知识点梳理
10 | 类(1):继承和成员修饰符
11 | 类(2):抽象类与多态
12 | 类与接口的关系
13 | 泛型(1):泛型函数与泛型接口
14 | 泛型(2):泛型类与泛型约束
15 | 类型检查机制(1):类型推断
16 | 类型检查机制(2):类型兼容性
17 | 类型检查机制(3):类型保护
18 | 高级类型(1):交叉类型与联合类型
19 | 高级类型(2):索引类型
20 | 高级类型(3):映射类型
21 | 高级类型(4):条件类型
22 | ES6与CommonJS的模块系统
23 | 使用命名空间
24 | 理解声明合并
25 | 如何编写声明文件
26 | 配置tsconfig.json(1):文件选项
27 | 配置tsconfig.json(2):编译选项
28 | 配置tsconfig.json(3):工程引用
29 | 编译工具:从ts-loader到Babel
30 | 代码检查工具:从TSLint到ESLint
31 | 使用Jest进行单元测试
32 | 创建项目
33 | 组件与类型(1):函数组件与类组件
34 | 组件与类型(2):高阶组件与Hooks
35 | 事件处理与数据请求
36 | 列表渲染与路由
37 | Redux与类型
38 | 搭建服务端开发环境
39 | 列表的CRUD
40 | 导出Excel
41 | 搭建Vue开发环境
42 | 组件封装
43 | 组件发布
44 | 共存策略
45 | 宽松策略
46 | 严格策略
47 | 结课测试&结束语
本节摘要
登录 后留言

全部留言(9)

  • 最新
  • 精选
Kai
interface 和 type 关键字的区别是什么呢,有时候两者都可以,有时候只能使用 type,比如映射类型 type T = ReadOnly<Obj>

作者回复: type和interface 多数情况下有相同的功能,就是定义类型。但有一些小区别: type:不是创建新的类型,只是为一个给定的类型起一个名字。type还可以进行联合、交叉等操作,引用起来更简洁。 interface:创建新的类型,接口之间还可以继承、声明合并。

2020-03-22
8
wzx
ReturnType确实讲的比较简单, 不知道该怎么理解, R是怎么来的? infer R ? R : any 什么情况下是any?

作者回复: 我再解释一下:简单讲,ReturnType 接受一个函数类型,并返回这个函数的返回值类型。这里关键在于 (infer R),返回值类型 R 此时是不能确定的,只有在函数执行之后才知道,是一种延迟推断,所以用 infer 修饰。特殊情况,比如 type T1 = ReturnType<any>,T1 的类型是 any。

2020-03-01
ofttryaj
type FunctionPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T]; 大括号后面的,[keyof T]怎么解释

作者回复: 它表示一个数组类型,数组元素是类型T的公共属性名的字面量联合类型

2020-01-07
Hurry
老师,strictNullChecks 会导致 NonNullable 失效 type T5 = NonNullable<string> const b:T5 = undefined;

作者回复: T5是string类型,strictNullChecks关闭,就可以被赋值undefined,和NonNullable没关系,你的问题是什么?

2019-08-01
3
pacos
ReturnType 的例子没有,R 不太清楚是哪里来的
2020-02-02
1
1
苏彧
老师,never | "b" | "c", 为什么把never去掉了,原因是什么吖
2022-11-15
丁作祥
Extract 直接以返回T , U的交集来理解是不是好理解一点
2021-12-09
北冥有人
先看 case ``` // 定义 // 基类,提供 可以从 json 给 class instance 赋值的能力 class KlassFromJSON<T, K extends keyof T> { public fromJSON(json: Omit<T, "fromJSON" | K> & Partial<Pick<T, K>>) { Object.keys(this).forEach(key => { // @ts-ignore if (json[key] !== undefined) { // @ts-ignore this[key] = json[key]; } }); } } // fromJSON 参数,salary 可选 export class ExtInfo extends KlassFromJSON<ExtInfo, "salary" | "nickname"> { department = ""; nickname = ""; salary?: number = 0; } // fromJSON 参数,"extInfo" | "age" 可选 export class Info extends KlassFromJSON<Info, "extInfo" | "age"> { constructor(extInfo: ExtInfo) { super(); this.extInfo = extInfo; } name = ""; age = 18; extInfo: ExtInfo; } // 使用 export default () => { const extInfo = new ExtInfo(); // 这里可以只赋值 required 属性 department extInfo.fromJSON({ department: "xxx" }); const info = new Info(extInfo); // 这里可以只赋值 required 属性 name info.fromJSON({ name: "xxx" }); }; ``` 老师,请问以上代码,怎么写能更优雅呢? 场景是: - 可以 new 一个 Class,他的内容可以从 API / Cache 里 填充 / 恢复 - 想对JSON 有类型规范, JSON 的 type,相比 Class 有些字段是非必填的,即没有的时候,不要去改变 Class 字段的默认值 - 不想去再定义一个 Interface 以上代码是我的实现,在父类里,先把 fromJSON 和 K 排除掉,然后 把 K 改为 可选字段 感觉最有问题的是能否省略掉 T,因为使用的时候,T 已经确定了,延迟推断不太会用。 尝试用过 this,不太好使 因为 this 是 any。 不知道还有什么更简单的写法么?
2020-12-25
ofttryaj
type FunctionPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T]; 大括号后面的,[keyof T]怎么解释
2020-01-07
收起评论