typescript 条件类型的extends不是继承的意思吗

新手上路,请多包涵
interface b{
  c:string;
  d:number;
}
interface e{
  c:string;
}
type a<T>=T extends e?string:number;
type t=a<b>
//type tt2 = string

这里的tt2为啥是string?

阅读 2k
2 个回答

extends 可以用作继承,也可以用作条件类型,或者类型约束,具体取决于使用场景。
interfaceclass 上时,表示继承,如下:

// class
class Dog extends Animal{}
// interface
interface Dog extends Animal{}

在泛型中,可以用作类型约束,如下:

// 这里约束 arg 必须有 length 属性
function log<T extends {length: number}>(arg: T):void{
    console.log(arg.length)
}

还可以用作条件类型,有点像JS中条件类型的形式 condition ? trueExpression : falseExpression,形式如下

SomeType extends OtherType ? TrueType : FalseType;

例如:

interface Animal {
  live(): void;
}
interface Dog extends Animal {
  woof(): void;
}

type T1 = Dog extends Animal ? number : string;
// type T1 is number

type T2 = RegExp extends Animal ? number : string;
// type T2 is string

针对上面的例子,我们加上泛型使其更加通用

type T1<T> = T extends Animal ? number : string;

type T2 = T1<Dog>
// type T2 is number

type T3 = T1<RegExp>
// type T3 is string

相信看到这,再结合 @然后去远足 的答案,你应该知道答案了
参考

是继承(严格来说是扩展,也即子类在拥有父类的全部成员基础之上、额外扩展出一些成员)。

但 TS 的类型系统是“鸭子类型”(当看到一只鸟走起来像鸭子、游起来像鸭子、叫起来也像鸭子,那么这只鸟就是鸭子)。

所以并不需要显式interface b extends e {}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题