Typescript 从同级键推断对象键类型';s值

Typescript 从同级键推断对象键类型';s值,typescript,Typescript,我有一个对象类型Options,有两个键: 策略:需要一个未知类型参数的函数 参数:与策略的第一个参数类型相同 我希望能够做到以下几点 type FooParameter = { foo: string } type BarParameter = { bar: string } const fooOptions: Options = { strategy: (parameter: FooParameter) => {}, parameter: { foo: 'foo' } } c

我有一个对象类型
Options
,有两个键:

  • 策略
    :需要一个未知类型参数的函数
  • 参数
    :与
    策略
    的第一个参数类型相同
  • 我希望能够做到以下几点

    type FooParameter = { foo: string }
    type BarParameter = { bar: string }
    
    const fooOptions: Options = {
      strategy: (parameter: FooParameter) => {},
      parameter: { foo: 'foo' }
    }
    const barOptions: Options = {
      strategy: (parameter: BarParameter) => {},
      parameter: { bar: 'bar' }
    }
    
    类型
    foopoptions.参数
    应该从
    foopoptions.策略
    barOptions.参数
    barOptions.策略


    这在今天的TypeScript中是可能的吗?

    我能想象的唯一方法是使用泛型类型。我认为不太可能有一种解决方案,编译器会在不使用泛型类型的情况下检查
    参数
    是否是
    策略
    的合适参数

    类型选项={
    策略:(参数:T)=>void,
    参数:T
    }
    
    这意味着如果在类型注释中使用了
    选项
    ,则必须提供类型参数:

    const foopoptions:Options={
    策略:(参数:fooparmeter)=>{},
    参数:{foo:'foo'}
    }
    函数useOptions(o:Options):无效{
    o、 策略(o参数);
    }
    
    但是,在允许编译器推断类型的任何地方(即不使用类型注释时),都不需要为泛型类型参数提供显式类型。特别是,API(如
    useOptions
    函数)的用户可以传递对象文本,并享受类型检查和类型推断的好处:

    useOptions({
    策略:param=>{
    设x=param.x;//推断为数字
    设y=param.y;//推断为字符串
    //错误:类型“{x:number,y:string}”上不存在属性“z”
    设z=param.z;
    },
    参数:{x:1,y:'foo'}
    });
    
    请注意,本例中的用户不必显式地编写
    {x:number,y:string}
    或等效类型来使用API


    我能想象的唯一方法是使用泛型类型。我认为不太可能有一种解决方案,编译器会在不使用泛型类型的情况下检查
    参数
    是否是
    策略
    的合适参数

    类型选项={
    策略:(参数:T)=>void,
    参数:T
    }
    
    这意味着如果在类型注释中使用了
    选项
    ,则必须提供类型参数:

    const foopoptions:Options={
    策略:(参数:fooparmeter)=>{},
    参数:{foo:'foo'}
    }
    函数useOptions(o:Options):无效{
    o、 策略(o参数);
    }
    
    但是,在允许编译器推断类型的任何地方(即不使用类型注释时),都不需要为泛型类型参数提供显式类型。特别是,API(如
    useOptions
    函数)的用户可以传递对象文本,并享受类型检查和类型推断的好处:

    useOptions({
    策略:param=>{
    设x=param.x;//推断为数字
    设y=param.y;//推断为字符串
    //错误:类型“{x:number,y:string}”上不存在属性“z”
    设z=param.z;
    },
    参数:{x:1,y:'foo'}
    });
    
    请注意,本例中的用户不必显式地编写
    {x:number,y:string}
    或等效类型来使用API


    为什么不将
    选项设置为通用选项,而不是推断?例如,
    type Options={strategy:(parameter:T)=>void,parameter:T}
    。我应该添加,我尝试了:但是我想避免传递参数类型的需要上下文是的
    authStrategy
    auth
    选项
    authStrategy
    设置为外部包,参数类型未知。因此,推断它比使用类型参数要好得多。Typescript可以推断泛型类型的类型参数,因此调用方不需要显式编写该类型。我应该更清楚,这不是您的库推断它,而不是用户推断其数据类型。文档中的示例用法看起来应该可以与泛型类型一起使用,而不需要对示例用法代码进行任何更改。“Typescript可以推断泛型类型的类型参数”,这听起来像是我想要的,但不知道如何操作。你能在下面的答案中分享一个例子吗?与其推断,为什么不将
    选项设置为泛型?例如,
    type Options={strategy:(parameter:T)=>void,parameter:T}
    。我应该添加,我尝试了:但是我想避免传递参数类型的需要上下文是的
    authStrategy
    auth
    选项
    authStrategy
    设置为外部包,参数类型未知。因此,推断它比使用类型参数要好得多。Typescript可以推断泛型类型的类型参数,因此调用方不需要显式编写该类型。我应该更清楚,这不是您的库推断它,而不是用户推断其数据类型。文档中的示例用法看起来应该可以与泛型类型一起使用,而不需要对示例用法代码进行任何更改。“Typescript可以推断泛型类型的类型参数”,这听起来像是我想要的,但不知道如何操作。你能在下面的回答中分享一个例子吗?在
    useOptions
    例子中,
    param
    方法参数的类型似乎是从
    参数推断出来的。我在寻找相反的答案。有什么想法吗?任何一个都可以从另一个推断出来。如果使用
    strategy:(param:FooParameter)=>{}
    调用它,那么它将检查
    parameter
    是否属于
    FooParameter
    类型