我正在尝试创建类型Optional<T, TProps>
,其中T
-初始类型,TProps
-必须是可选属性的联合类型。
例如:
type A = Optional<{a: string, b: string}, 'a'>
const a: A = {b: 'foo'} // No Error
我希望它可以工作,但是不起作用
type Optional<T extends object, TProps extends keyof T> =
{[TKey in keyof T]: TKey extends TProps ? T[TKey] | never : T[TKey]}
答案 0 :(得分:2)
根据上面的代码,我认为您需要使用Exclude
和Pick
解决方案。
我正在和他们一起玩,看来,以下解决方案有效:
type Optional<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & Partial<Pick<T, K>>
如果您要添加到b
不正确的字段,则下面的示例将显示错误,并且如果您删除可选参数,则不会突出显示
interface BI {
a: number
b: number
g: string,
f: boolean
}
const a: BI = {a: 1, b: 2, g: 'sdf', f: true}
const b: Optional<BI, 'g'> = {a: 5, b: 1, f: true}