【发布时间】:2020-08-27 03:15:59
【问题描述】:
我正在尝试基于对象中的嵌套属性创建联合类型。请看下面的例子:
type Foo = {
abilities: {
canManage: boolean
}
}
type Bar = {
abilities: {
canManage: boolean
}
extraProp: number
}
type Condition1 = {
abilities: {
canManage: true
}
} & Bar
type Condition2 = {
abilities: {
canManage: false
}
} & Foo
type TotalData = Condition1 | Condition2
const data: TotalData = {
abilities: {
canManage: false, // if canManage is false, TS should complain when I add the `extraProp` key
},
extraProp: 5
}
我遇到的问题是打字稿忽略了我设置的条件。如果 canMange 值为 true,我只对允许某些属性感兴趣。这在嵌套时似乎不起作用。但是,如果我只是有这样的东西而没有嵌套,那就没问题了:
type Foo = {
canManage: boolean
}
type Bar = {
canManage: boolean
extraProp: number
}
type Condition1 = {
canManage: true
} & Bar
type Condition2 = {
canManage: false
} & Foo
]
type TotalData = Condition1 | Condition2
const data: TotalData = {
canManage: false,
extraProp: 5 // now typescript complains that this property shouldn't be here because canManage is false
}
在尝试基于嵌套对象内的属性设置联合时,我该如何解决这个问题?
【问题讨论】:
-
type Foo = { abilities: { canManage: boolean }; extraProp?: never }会满足您的需求吗?仅在特定情况下才禁止额外的属性,这似乎不是其中之一。如果这对你有用,我会写一个答案;如果不是,请解释什么不适用于您的用例。祝你好运! -
该解决方案可能暂时可行,但它有点 hacky,因为这是 TypeScript 的一个真正问题,您可能应该提交一个错误报告。
-
4.2 可能会解决这个问题:github.com/microsoft/TypeScript/pull/38839
标签: typescript typescript-typings react-typescript