Typescript 对于类型T(作为一组属性),如何创建类型V减去U,即T的子集?
我有一个带有几个属性的界面:Typescript 对于类型T(作为一组属性),如何创建类型V减去U,即T的子集?,typescript,generics,types,subset,Typescript,Generics,Types,Subset,我有一个带有几个属性的界面: interface Abcd { a: string b: number c: boolean d: string } 我想为作为参数传递给函数setOptions的对象定义类型Options。在选项对象中,有两个属性: interface Abcd { a: string b: number c: boolean d: string } fn是一个异步回调,返回Abcd的属性子集 remaining是包含fn的返回类型中缺少的剩
interface Abcd {
a: string
b: number
c: boolean
d: string
}
我想为作为参数传递给函数setOptions
的对象定义类型Options
。在选项
对象中,有两个属性:
interface Abcd {
a: string
b: number
c: boolean
d: string
}
fn
是一个异步回调,返回Abcd
的属性子集remaining
是包含fn的返回类型中缺少的剩余属性的对象
setOptions<Abcd>({
fn: async () => ({ a: "aaa" }),
remaining: {
b: 123,
c: false,
d: "ddd",
}
})
我试过:
interface Options<T extends object, U = Partial<T>, V = Omit<T, keyof U>> {
fn: () => Promise<U>
remaining: V
}
function setOptions<T extends object>(options: Options<T>) {
}
接口选项{
fn:()=>承诺
剩余:V
}
函数设置选项(选项:选项){
}
这是我最近的尝试,但不是解决办法
帮助:相同的代码。没有
K的类型推断
interface Options<T extends object, K extends keyof T> {
fn: () => Promise<Pick<T, K>>;
remaining: Omit<T, K>
}
function setOptions<T extends object, K extends keyof T>(options: Options<T, K>) {}
interface Abcd {
a: string
b: number
c: boolean
d: string
}
setOptions<Abcd, 'a'>({
fn: async () => ({ a: "aaa" }),
remaining: {
b: 123,
c: false,
d: "ddd",
}
})
谢谢。但是我真的需要'a'
是从fn
的返回类型推断出来的。更新了我的答案。谢谢。如果TypeScript团队能够解决这个问题以避免无用函数返回函数的丑陋攻击,那就太好了。
const setOptions = <T extends object>() =>
<K extends keyof T>(source: {
fn: () => Promise<Pick<T, K>>;
remaining: Omit<T, K>
}) => { }
interface Abcd {
a: string
b: number
c: boolean
d: string
}
setOptions<Abcd>()({
fn: async () => ({ a: '' }),
remaining: {
b: 1,
c: false,
d: "ddd",
}
})