![](/img/trans.png)
[英]How to do TypeScript tsdoc documentation for function argument with generic type that extends an interface?
[英]Typescript: use specific extended interface to satisfy generic “extends” type argument?
这是一个小代码示例(旁注:我正在运行 Typescript v3.8.3):
interface IOptions<T> {
arg: T;
}
interface IExtraOptions extends IOptions<number> {
arg2: string;
}
type Func = <T, OptionsT extends IOptions<T>>(options: OptionsT) => T;
const f: Func = (options: IExtraOptions): number => {
return options.arg2 === 'dev' ? 0 : options.arg;
};
我希望这可以工作,因为IExtraOptions
扩展IOptions
并因此满足了OptionsT extends IOptions<T>
约束,但我得到:
类型“OptionsT”不可分配给类型“IExtraOptions”。
“IOptions”类型中缺少属性“arg2”,但在“IExtraOptions”类型中是必需的。ts(2322)
完全删除OptionsT
参数并仅使用IOptions<T>
作为“选项”的类型参数会产生相同的错误。 用非默认类型替换“数字”也不能解决它。 有人知道我在做什么错吗?
如果你有一个通用的 function,function 的 generics 类型参数是供调用者确定的,而不是用于修复某些任意类型的实现。 例如,给定您的示例,此调用将是有效的f<boolean, IOptions<boolean>>({ arg: true })
并且您指定的实现不会返回 object 以满足这些类型参数。
结论是,如果你有一个通用的 function,通常只有一个通用的 function 将满足实现(尽管使用非常松散的类型,例如any
, never
或unknown
也可能工作)。
如果你想创建专门的函数,不要使用泛型 function,使用恰好是 function 的泛型类型:
type Func <T, OptionsT extends IOptions<T>> =(options: OptionsT) => T;
const f: Func<number, IExtraOptions> = (options ) => {
return options.arg2 === 'dev' ? 0 : options.arg;
};
您还可以从TOptions
派生T
以简化一些事情:
type Func <OptionsT extends IOptions<any>> =(options: OptionsT) => OptionsT['arg'];
const f: Func<IExtraOptions> = (options ) => {
return options.arg2 === 'dev' ? 0 : options.arg;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.