【发布时间】:2022-01-15 20:01:56
【问题描述】:
在个人项目中,我遇到了 TypeScript 条件类型的问题。我对 TypeScript 文档中的条件类型有基本的了解。我希望下面的设置可以工作,但它会给出类型错误。
基本上,我正在尝试为从磁盘加载的树节点定义一个接口。这意味着某些节点可能由于缺少文件等而无法正确加载。因此任何节点实现都包含Content 或Error。
interface Content {
data: number;
}
interface Error {
code: string;
}
export interface TreeNode<T extends Content | Error> {
getValue(): T extends Content ? number : string;
}
class ValueNode<ValueType extends Content> implements TreeNode<ValueType> {
private readonly value: number;
public constructor(value: number) {
this.value = value;
}
public getValue(): number {
return this.value;
}
}
我希望getValue 方法的实现将被允许返回string,因为该接口是用扩展Content 的类型实现的。但是我收到了这种类型的错误:
ValueNode<ValueType>类型中的属性getValue不能分配给基本类型TreeNode<ValueType>中的相同属性。
- 类型
() => number不可分配给类型() => ValueType extends Content ? number : string。
- 类型
number不可分配给类型ValueType extends Content ? number : string
很清楚,我做错了。实现我的目标的正确方法是什么?
【问题讨论】:
-
鉴于
ValueType是一个类型参数,你为什么不在ValueNode<...>中使用它? -
顺便说一句,
Error是一个内置类型,所以你应该给你的interface Error一个不同的名字,比如interface MyError左右。 -
Typescript 非常适合将 JavaScript 制作成 c#。而且,这对节点很有用。 JavaScript 没有 "types" 以同样的方式。 @dai 编辑了错误以使其更加透明。
-
@wahwahwah 请原谅?你所说的与手头的问题没有任何关系。
-
看起来
class ValueNode implements TreeNode<Content>就是您要找的东西..
标签: javascript typescript