javascript - Typescript:为什么我们不能为泛型类型分配默认值?
问题描述
以下面为例。我不太确定错误消息的含义,但从逻辑上看,签名是完全有效的。这只是TS不支持吗?
function _createNominalCollection<isOutputOrdered_T extends boolean>(
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<false>()
是有问题的。让我们再看看这个错误:
“布尔”可分配给“isOutputOrdered_T”类型的约束,但“isOutputOrdered_T”可以用约束“布尔”的不同子类型实例化。ts(2322)
这意味着您将显式<false>
类型作为泛型参数传递,isOutputOrdered_T
现在被限制为false
但默认参数是true
,这将违反这一点。
或者换一种说法,true
andfalse
是 的子类型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
. 然后你有一个处理这两种情况的实现。
推荐阅读
- selenium - 打开邮箱中发送的验证码,然后复制此代码并将其粘贴到 selenium 测试中的验证码字段中
- javascript - 如何编写显示文本的事件处理程序
- python - 使用openpyxl在两个excel单元格之间画一条线
- java - FileOutputStream 或任何使用 java 文件的创建文件默认创建在 Eclipse 主文件夹的相对路径中
- assembly - 具有单独文档标题的 Doxygen 和汇编源文件
- swift - Swift:在 Firebase 数据库中搜索特定值并查找所有相关数据
- asp.net-core - 为每个请求手动验证用户的声明
- postgresql - 在交易日期之间生成日期系列
- java - 过滤带有特定注解的类
- npm - 有没有办法将一个 npm 包及其所有依赖项导入 verdaccio?