typescript - 打字稿函数输出不能分配给条件类型
问题描述
我有一个更复杂问题的简化版本。以下导致 TSC 抛出错误:
type Demo<isTrue> = isTrue extends true ? { a: string } : isTrue extends false ? { b: string } : never;
const func = <T extends boolean>(arg: T): Demo<T> => {
if (arg) {
return {a: "hello" };
} else {
return { b: "world" };
}
};
const out = func(true);
引发以下错误:
Type '{ a: string; }' is not assignable to type 'Demo<T>'.
Type '{ b: string; }' is not assignable to type 'Demo<T>'.
out
底部的检查类型正确,所以只是函数定义有问题。我怎样才能更好地理解这一点以及如何解决它?
解决方案
我添加了重载并Demo<boolean>
作为返回类型。
在这种特殊情况下T extends boolean
,实际上与Demo<boolean>
.
但请记住,泛型很棘手。extends
不代表equal
。
type Demo<isTrue> = isTrue extends true ? { a: string } : isTrue extends false ? { b: string } : never;
function func(arg: false): Demo<false>
function func(arg: true): Demo<true>
function func(arg: boolean): Demo<boolean> {
if (arg === true) {
const a = arg;
return { a: "hello" };
} else {
return { b: "world" };
}
};
const out = func(true);
推荐阅读
- python - 如何在一段时间内使用pandas groupby并找到同一时间段内多年的平均计数
- javascript - 找到正确的选择器:在 jquery 中将 div 添加到父级
- vb.net - 列表视图不更新子项(VB.net)
- google-maps - 在谷歌地图中获取图标位置的纬度和经度
- python - 如何使用 Twisted 嗅探网络接口?
- php - 按属性集 ID 过滤类别产品
- reactjs - Aframe-react 如何注册和使用自定义组件?
- ruby-on-rails - 从购物车中删除物品时,Ruby on Rails 会引发错误
- python - 如何使递归函数坚持它的用途?
- visual-studio - dotnet 核心项目未在 docker 中运行