You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
interfaceSquare{width: number;}interfaceRectangle1extendsSquare{// Type 'string' is not assignable to type 'number'width: string;height: string;}typeRectangle2=Square&{// OKwidth: string;height: string;}letrectangle: Rectangle2={width: '10px',// Type 'string' is not assignable to type 'never'.height: '12px'}
由此我们可以得到第一个结论:当遇到对象属性类型冲突的时候,& 会给冲突属性 never 类型,而 extends 会直接报错
接下来,我们再看看函数的例子:
interfaceStringToNumber{convert: (value: string)=>number;}interfaceNumberToString{convert: (value: number)=>string;}// Named property 'convert' of types 'StringToNumber' and 'NumberToString' are not identical.interfaceBidirectionalConvert1extendsStringToNumber,NumberToString{}// {convert: (value: string | number) => string | number;}typeBidirectionalConvert2=StringToNumber&NumberToString
Typescript: 深入 & 操作符与 extends 的区别
下面是一个类型拓展的两种常见用法:
Playground Link
看起来没有什么不同对吧?那么看看下面的例子:
Playground Link
上面的例子用了两种方法拓展了不同类型的 width,我们可以观察到两点区别:
extends
的时候马上就报错了(line 5)&
的时候会将 width 的类型指派为 never,后面我们把 string 类型分配给 never 才报错(line 16)由此我们可以得到第一个结论:当遇到对象属性类型冲突的时候,& 会给冲突属性 never 类型,而 extends 会直接报错
接下来,我们再看看函数的例子:
Playground Link
自此,我们可以得到第二个结论:当遇到函数类型冲突的时候,& 会联集函数的参数与返回值,而 extends 会直接报错
Reference
Difference between extending and intersecting interfaces in TypeScript?
Interfaces vs Intersections
The text was updated successfully, but these errors were encountered: