gpt4 book ai didi

Typescript 假定属性类型为 T |属性 ["key"] 而不仅仅是 T

转载 作者:行者123 更新时间:2023-12-04 07:21:59 31 4
gpt4 key购买 nike

假设我们有一个这样定义的类型:

type PropsBase<T> = {
optionalProp?: T;
}

type Props<T, TAdditionalProps extends object> = PropsBase<T> & TAdditionalProps
基本上我有一个公共(public)属性对象,然后子类可以在需要时添加更多属性。
然后我想这样使用它:
type State<T> = {
value: T;
}

abstract class Base<T, TAdditional extends object = {}> {
state: State<T>;
constructor(props: Readonly<Props<T, TAdditional>>) {
this.state = {
value: props.optionalProp || this.fallbackValue() // ERROR!
}
}

abstract fallbackValue(): T;
}
这会导致以下错误:
TS2322: Type 'T | Props<T, TAdditional>["optionalProp"]' is not assignable to type 'T'.
  'T' could be instantiated with an arbitrary type which could be unrelated to
'T | Props<T, TAdditional>["optionalProp"]'.
如果我制作 optionalProp不是可选的(删除 ? )然后它可以工作,如果我删除它也可以工作 Readonly来自构造函数,只需使用 Props<T, TAdditional>反而。
所以我的问题是 : 为什么会这样?有没有办法仍然使用 Readonly在这里并有一个可选的属性?
附言我有 strict: true在我的 tsconfig.json 中。我知道如果我将它设置为 false它会工作的。

最佳答案

我认为从 || 切换到 ??解决您的问题。
Playground

type PropsBase<T> = {
optionalProp?: T;
}

type Props<T, TAdditionalProps extends object> = PropsBase<T> & TAdditionalProps

type State<T> = {
value: T;
}

abstract class Base<T, TAdditional extends object = {}> {
state: State<T>;
constructor(props: Readonly<Props<T, TAdditional>>) {
this.state = {
value: props.optionalProp ?? this.fallbackValue()
}
}

abstract fallbackValue(): T;
}

关于Typescript 假定属性类型为 T |属性 ["key"] 而不仅仅是 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68440372/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com