typescript - TS(2352) 声明具有动态属性和一个具有特定类型的属性的对象
问题描述
我需要创建一个对象,该对象将包含一个名为“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)
我了解与尝试将属性state
转换为的 TypeScript 相关的问题[methodName: string]: (this: ContextModule<State>, ...args: any[]) => any
,但是为什么我在声明动态属性之前声明了此属性
可能有人看到了同样的问题。希望得到您的帮助,谢谢!
解决方案
我可以让它干净地工作的唯一方法是使用交集类型,但似乎动态类型和具有固定属性的类型(与动态道具的类型不同)的交集只能使用Object.assign
.
这是我如何工作的简化示例:
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
推荐阅读
- javascript - reactjs中优化的搜索栏过滤器
- amazon-web-services - 私有子网中的 lambda 如何访问公共子网中的 EC2?
- javascript - 如何在javascript中的按钮单击上设置计时器?
- python - 打印 n 对括号的所有有效组合的算法
- c++ - 我应该怎么做才能优化这个 C++ 代码?我不知道哪个语句需要更多的执行时间
- swift - 滚动视图分页内容大小不适用于 iphone 5s ios 12
- r - 消除列 R 中的字符
- python - 如何让我的 JSON 解码器正常工作?
- powershell - 在 PowerShell 中结合 `Get-Disk` 信息和 `LogicalDisk` 信息(但带有格式化输出)
- reactjs - react-top-loading-bar 警告:无法对未安装的组件执行 React 状态更新