我正在尝试使用具有一种类型的所有属性的类型,但也允许添加另一种类型的动态属性(类似于这个问题)。
类型定义如下:
type Foo = string | string[]
type Bar = { n: number, str?: string }
// A dictionary which only allows Foo values
type FooDict = { [key: string]: Foo | undefined }
// Has all static properties of Bar plus some dynamic Foo properties
type FooBar = FooDict & Bar
我期待像这样使用它们:
const bar: Bar = { n: 1 }
const fooBar: FooBar = bar
const n: number = fooBar.n
const str: string | undefined = fooBar.str
const foo: Foo | undefined = fooBar['someRandomKey']
问题是第二行给出了编译错误:“类型'Bar'不可分配给类型'FooBar'。类型'Bar'不可分配给类型'FooDict'。属性'n'与索引签名不兼容。类型' number' 不可分配给类型 'Foo | undefined'。TS2322"。
我看不出它无法工作的任何原因。
Bar
和的所有键FooDict
都是字符串,所以没有不匹配。- 如果使用 的键
Bar
,我们可以使用 Bar 对应的静态属性。 - 否则,我们可以使用 from 的类型
FooDict
,它是Foo
(当属性存在时)或undefined
(当使用没有值的键时)。
如链接问题中所述,如果将动态属性键入为any
. 但是由于我只需要将 Foo 实例设置为动态属性,因此我想使用类型系统强制执行它。这可能吗?