gpt4 book ai didi

typescript - TS(2352) 声明具有动态属性的对象和具有特定类型的一个属性

转载 作者:行者123 更新时间:2023-12-04 01:43:35 37 4
gpt4 key购买 nike

我需要创建一个对象,该对象将包含一个名为“state”的属性,该属性将具有泛型类型,而所有其他属性将是具有覆盖上下文的函数。我不确定这是否可能,因此我决定写信到这里。

我有一个代码:

declare interface ContextModule<State> {
state: State
}

export declare interface SuperModule<State = any> {
state?: State | any,
[methodName: string]: (this: ContextModule<State>, ...args: any[]) => any
}

const lol = {
getFoo (): any {
return this.state.foo
}
} as SuperModule

在这段代码中,我没有任何错误。它执行成功,但如果我会添加

declare interface ContextModule<State> {
state: State
}

export declare interface SuperModule<State = any> {
state?: State | any,
[methodName: string]: (this: ContextModule<State>, ...args: any[]) => any
}

const lol = {
getFoo (): any {
return this.state.foo
},
+ state: { // added this property
+ foo: 'string'
+ }
} as SuperModule

然后我会看到输出
Conversion of type '{ getFoo(this: ContextModule<any>): any; state: { foo: string; }; }' to type 'SuperModule<any>' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
Property 'state' is incompatible with index signature.
Type '{ foo: string; }' is not comparable to type '(this: ContextModule<any>, ...args: any[]) => any'.
Type '{ foo: string; }' provides no match for the signature '(this: ContextModule<any>, ...args: any[]): any'.ts(2352)

我知道这个问题与 TypeScript 试图转换属性 state 有关。至 [methodName: string]: (this: ContextModule<State>, ...args: any[]) => any ,但是为什么我在声明动态属性之前声明了这个属性

可能有人看到了同样的问题。希望得到您的帮助,谢谢!

最佳答案

我可以让它干净利落地工作的唯一方法是使用交集类型,但似乎只能使用 Object.assign 创建动态类型和具有固定属性的类型(与动态 Prop 的类型不同)的交集。 .

这是我如何工作的简化示例:

interface MyType {
requiredProp1: string
}
interface MyOtherType{
[key: string]: number
}
type ISect = MyType & MyOtherType

const obj: ISect = Object.assign({ requiredProp1: "ff" }, { foo: 1 })

const rp1 = obj.requiredProp1 //string
const foo = obj.foo //number

关于typescript - TS(2352) 声明具有动态属性的对象和具有特定类型的一个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56349619/

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