热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

打字稿:为什么我们不能为泛型类型分配默认值?

以下面的为例。我不太确定错误消息的含义,但从逻辑上讲,签名似乎是完全有效的。TS不支持这个吗?function_createNominalCollection

以下面的为例。我不太确定错误消息的含义,但从逻辑上讲,签名似乎是完全有效的。TS 不支持这个吗?

function _createNominalCollection(
input: nominal_T,
processingFunc: (count: number) => number,
orderedOutput: isOutputOrdered_T = true,
)
^^^
Type 'boolean' is not assignable to type 'isOutputOrdered_T'.
'boolean' is assignable to the constraint of type 'isOutputOrdered_T', but 'isOutputOrdered_T' could be instantiated with a different subtype of constraint 'boolean'.ts(2322)

回答


正如@VLAZ 指出的那样_createNominalCollection()是有问题的。让我们再看看这个错误:

“boolean”可分配给“isOutputOrdered_T”类型的约束,但“isOutputOrdered_T”可以用约束“boolean”的不同子类型实例化.ts(2322)

这意味着您将显式类型作为泛型参数传递,isOutputOrdered_T现在被限制为 ,false但默认参数是true,这将违反这一点。

或者换句话说,true并且false是 的子类型boolean,并且您的函数允许将布尔值限制为这些子类型之一,但不保证对该变量的分配都属于相同的子类型。

让我提出一个替代方案。


当您有一个基于不同参数返回不同类型的函数时,您应该始终考虑函数重载是否更适合建模而不是泛型。它们允许您以简单的方式将参数模式专门映射到特定的返回类型,而根本不需要任何泛型。

例如:

// sorted version
function myFn(orderedOutput?: true): 'sorted'
// unsorted version
function myFn(orderedOutput: false): 'unsorted'
// Implementation
function myFn(orderedOutput: boolean = true): 'sorted' | 'unsorted' {
return orderedOutput ? 'sorted' : 'unsorted'
}
// Testing
const a = myFn(true) // sorted
const b = myFn(false) // unsorted
const c = myFn() // sorted

在这里,您可以为您的功能创建两个签名。第一个“排序”版本不接受任何参数或true. 第二个“未排序”版本接受false. 然后你有一个处理这两种情况的实现。

操场






推荐阅读
author-avatar
TT0852_235
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有