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
类型