【发布时间】:2020-08-25 07:31:36
【问题描述】:
如果我有一个函数将返回提供的值(如果它不是容器)或容器内的值(如果提供的值是容器),我该如何正确声明该函数的返回类型?例如:
interface Container<TValue> {
value: TValue;
}
declare function isContainer<TContained>(
object: unknown
): object is Container<TContained>;
type ContainedTypeOrItself<T> = T extends Container<infer U> ? U : T
function getContainedValueOrSelf<T>(
input: T,
): ContainedTypeOrItself<T> {
if (isContainer<ContainedTypeOrItself<T>>(input)) {
return input.value
}
return input
}
这种方法似乎不起作用,因为 TypeScript 编译器为 return input 语句引发了错误:
Type 'T' is not assignable to type 'ContainedTypeOrItself<T>'.
由于我相信if 子句过滤了所有Container 类型的对象,我认为当代码到达return input 语句时,T 不是Container,所以ContainedTypeOrItself<T> 应该只需输入自己,T。显然,鉴于编译器错误,我对这应该如何工作的理解是不正确的。
在我的另一个 related question 中,我了解到为什么使用三元运算符和不小心使用 any 会导致与使用 if-else 语句时不同的行为。但是,我仍然认为我太密集了,无法理解代码实际上有什么问题,而且我已经阅读了 cmets 并多次回答。他们确实准确地回答了那里提出的问题:为什么三元运算符和if-else 之间存在不同的行为,对此我很感激——这正是我所寻找的。但是,在这个问题中,我使用了一个更简单的示例(谢谢!),并试图在打字时尽可能具体。即使尝试应用有关 any 用法、三元运算符和使用该答案中的简化代码的经验教训,我仍然无法弄清楚它为什么不起作用。
感谢您抽出宝贵时间阅读本文并提供帮助!
【问题讨论】:
标签: typescript typescript-generics