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",
      }
    })