首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入类型系统_TypeScript笔记8

[] Null、Undefined和Never是其它类型子类型,因此可以赋值任何其它类型变量 (摘自基本类型_TypeScript笔记2) 也就是说,要确定数组类型的话,先要确定每个元素类型,再考虑其兼容关系...,以确保类型安全,因此: // 把父类型赋值子类型,在逆变场景中是安全 dogComparer = animalComparer; // Ok // 把子类型赋值父类型,在逆变场景(函数类型...以保证目标函数可以在所有源函数可调用地方调用,例如: interface sum { (a: number, b: number): number; (a: number[]): number;...return y; }// 正确 等价于把(y: any) => any赋值(x: any) => any identity = reverse; 七.类型兼容性 实际上,TypeScript规范中只定义了...赋值兼容性扩展了子类型兼容性,允许any相互赋值,以及enum和对应数值相互赋值 至于类型兼容性,规范中并未定义这个概念,在多数语境下,所谓类型兼容性遵从赋值兼容性,implements和extends

97040
您找到你想要的搜索结果了吗?
是的
没有找到

TS 从 0 到 1 - 泛型进阶

但这个函数并不是可以扩展或通用。 虽然可以使用 any 解决通用性问题,但那就失去了定义应该返回那种类型能力,并且也使编译器失去了类型保护作用。...,只要它指定了默认类型 # 泛型条件类型 条件类型可以根据某些条件得到不同类型,这里条件值类型兼容性约束。...虽然之前代码中使用了 extends 关键字,但也不一定要强制满足继承关系,而是检查是否满足结构兼容性。 // 若 T 能赋值 U 那么类型是 X,否则是 Y T extends U ?...如,never 类型是那些总是会抛出异常或根本就不会有返回值函数表达式或箭头表达式返回值类型。 没有类型是 never 子类型或可以赋值 never 类型(除了 never 本身)。...定义 // 如果 T 能赋值 U,那么就会返回 never 类型,否则返回 T 类型 // 最终实现效果就是将 T 中某些属于 U 类型移除掉 type Exclude = T extends

70120

前端应该掌握Typescript基础知识

, 可以赋值其他类型变量 strictNullChecks 为 true 的话不能赋值其他类型 let str: string; str = null; str = undefined; 任意类型...:void => {} never 类型 永远不存在值 任何类型字类型, 可以赋值任何类型 但是任何类型都不可赋值 never, 包括 any function error(msg: string...如果变量定义时候没有赋值, 默认是 any 类型 let x; // 可以赋值为任何类型值 let x1 = '生生世世'; // x1会推论成sring类型, 不能给x1赋值为其他类型了 // x1...ts 类型检查原则, 有一个东西看起来像鸭子、听起来像鸭子、叫起来也像鸭子,那么我们就可以认为他是鸭子 当一个类型 Y 可以赋值另一个类型 X 时, 就可以说类型 X 兼容类型 Y X 兼容 Y...可以通过配置 strictFunctionTypes 参数修复这个问题 枚举兼容性 枚举类型与数字类型兼容,并且数字类型与枚举类型兼容 不同枚举类型之间是不兼容 //数字可以枚举 enum Colors

57510

如何进阶TypeScript功底?一文带你理解TS中各种高级语法

通俗来说也就是多可以赋值,上述代码因为 a 类型定义中完全包括 b 类型定义,所以 a 类型完全是可以赋值 b 类型,这被称为类型兼容性。...,刚刚才提到类型兼容性原因 TS 允许不同类型进行互相赋值(只需要父/子集关系),那么明明 fn2 参数包括了所有的 fn1 为什么会报错?...自然,这是安全也是被 TS 允许赋值。 就比如上述函数参数类型赋值就被称为逆变,参数少(父)可以参数多(子)那一个。...看起来和类型兼容性(多可以)相反,但是通过调用角度来考虑的话恰恰满足多可以兼容性原则。 上述这种函数之间互相赋值,他们参数类型兼容性是典型逆变。...string|number|boolean 赋 string 类型 这里,函数类型赋值兼容时函数返回值就是典型协变场景,我们可以看到 fn1 函数返回值类型规定为 string,fn2 返回值类型规定为

1.6K10

TypeScript 对象类型-接口

因此赋值时变量形状必须和接口形状保持一致 二、可选属性 可选属性是指该属性可以不存在,当我们希望不要完全匹配一个形状,可以用可选属性: interface Person { name: string...: 25, gender: 'male' }; 四、只读属性 有时候我们希望对象中一些字段只能在创建时候被赋值,那么可以用 readonly 定义只读属性: interface Person...上例中,使用 readonly 定义属性 id 初始化后又被赋值,所以报错 注意,只读约束存在于第一次对象赋值时候,而非第一次只读属性赋值时候: interface Person {...上例中,报错信息有两处: 1、在对 faker 进行赋值时候,没有 id 赋值 2、在给 faker.id 赋值时候,由于它是只读属性,所以报错了 五、联合类型和接口 以下实例演示了如何在接口中使用联合类型...IParent2 { v2:number } interface Child extends IParent1, IParent2 { } let faker:Child = { v1

3.3K10

4000字讲清 《深入理解TypeScript》一书 【基础篇】

考虑使用 jquery 用例,你可以非常简单快速为它创建一个定义: declare var $: any; 有时候,你可能想某些变量一些明确定义(如:jquery),并且你会在类型声明空间中使用它...event as HTMLElement; // Error: 'Event' 和 'HTMLElement' 中任何一个都不能赋值另外一个 } 如果你仍然想使用那个类型,你可以使用双重断言。...类型被允许 你可以随意调用泛型参数,当你使用简单泛型时,泛型常用 T、U、V 表示。...: let foo: never = 123; // Error: number 类型不能赋值 never 类型 // ok, 做为函数返回类型 never let bar: never = ((...当一个函数没有返回值时,它返回了一个 void 类型,但是,当一个函数根本就没有返回值时(或者总是抛出错误),它返回了一个 never,void 指可以赋值类型(在 strictNullChecking

1.9K30

TypeScript不学?你养我啊

如上图,可以说Ts是Js超集。 定义类型好处 如下,我想求和a和b,但是又错误a赋值了'sk',那么c值就成了拼接字符串结果。...这种情况是 显示any let no_use : any 而在定义变量时,不赋值,就是 隐式any 。Ts检测到没有指定类型,然后添加类型为any。 let d; !!!!! 不建议使用。...let e:unknown e = 12 e ='sss' any和unknown区别 如下,any类型可以赋值字符串。...any可以霍霍别人儿 let no_use:any let str:string str = no_use 而 把unknown赋值别的类型 就会报错。...let str:string let e:unknown e ='sss' str = e unknown类型实际上是一个类型安全any,unknown类型变量不能赋值其他变量 unknown类型赋值

87420

详解增强算术赋值:“-=”操作是怎么实现

但也要意识到,如果你预先知道要将一个对象赋一个变量名,相比a - b 盲操作,就可能会更高效。...(译注:作者关于二元运算文章,译文在此) 最终无论用了哪种方法,返回值都会被赋值 a。...通过传入二元算术运算函数,并做一些自省(以及处理可能发生 TypeError),它可以被漂亮地归纳成: def _create_binary_inplace_op(binary_op: _BinaryOp...-= 支持 _create_binary_inplace_op(__ sub__),且可以推断出其它内容:函数名、调用什么 __i*__ 函数,以及当二元算术运算出问题时,该调用哪个可调用对象。...*w, PyObject *z) { if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_inplace_power

83010

初识 TypeScript

为什么要学习 TypeScript ? 3. 安装 TypeScript 4. 原始数据类型和 any 类型 5. 数组和元组(tuple) 6. Interface 接口 7....---- 程序更容易理解 ts 可以约定函数或方法输入输出参数类型,外部条件等 效率更高 在不同代码块和定义中进行跳转、代码补全、接口提示 更少错误 编译期间能够发现大部分错误,杜绝一些比较常见错误...另外一种是 Object 注意: undefined、null 是所有类型子类型,所以下面写法是正确 let age: number = undefined 顶级类型: any可以接收所有数据类型数据...函数中声明数据类型 ---- 普通声明函数函数结果返回 number 类型 /** 函数表达式声明函数返回是一个函数类型 const add = (x: number, y: number,...,没有指定数据类型,ts 会自动推测出一个类型,如下图: 因为 ts 已经将变量 x 类型推断为 number,那么当我们变量 x 赋值一个 string 类型数据则会提示错误 9.

85620

TypeScript: 思考类型使用具体情节

let a: void = null; let b: void = undefined; 4.1 any、void、never、unknown 区别 4.1.1 any ts 检测弱,兼容性问题解决方案...let a; // a: any a = 1; let a = 1; //a: number 4.1.2 void void应当仅仅用于函数声明,即没有明确返回值函数,应该被声明为void类型。...4.1.3 never never用于函数返回值时,表示函数有抛出异常,没有正常执行到底。用于变量声明,无法为其赋予任何值! never是所有类型子类型并且可以赋值所有类型。...没有类型是never子类型或能赋值never(never类型本身除外)。...never: T; 4.1.4 unknown unknown相对于any,任意类型都可以赋值unknow,但是不可对其进行任何访问操作(仅仅为类型安全,any操作访问也安全) let a:

56020

深入浅出 TypeScript

需要注意是,number是类型,而Number是构造函数。 当函数没有返回值时,返回类型就是void。只有null和undefined可以void 。...never 类型表示是那些永不存在类型,never类型是任何类型子类型,也可以赋值任何类型;然而,没有类型是 never子类型或可以赋值 never类型(除了never本身之外)。...Person) {} if (arg.name === 'chuck') {} if (typeof name === 'string') {} 类型兼容性 「类型兼容性」用于确定一个类型是否能赋值其他类型...P : T; 如果 T 能赋值 (param: infer P) => any,则结果是(param: infer P) => any类型中参数 P,否则返回为 T,infer P表示待推断函数参数...type ReturnType = T extends (...args: any[]) => infer P ? P : any; 如果T能赋值函数类型,则返回函数返回类型。

2.8K30
领券