typescript - 打字稿中有没有办法只允许除不返回布尔值的函数以外的任何东西?
问题描述
所以我遇到了一个问题,我有这样的功能:
function myFunc<T>(filterFnOrObj: T | (x: T) => boolean){
if (typeof input === 'function') {
someArray.filter(filterFnOrObj)
} else {
someArray.indexOf(filterFnOrObj)
}
}
可能发生的情况是,如果有人传入一个不是真正过滤器函数的函数,代码会将其视为过滤器,因为我不知道返回类型。我也不想调用该函数并查看它是否返回布尔值。
我要做的是防止人们传入一个函数,但不是返回布尔值的函数。任何其他类型都可以。我知道条件类型,但我不知道如何使用它们来完成这个。
解决方案
也许试试下面的代码。这里有 2 个主要组成部分:
FilterWorthy
filter
type - 它可以防止您在编译时传递任何签名不适合谓词的函数isFilterWorthy
是一个类型保护,它需要在运行时决定filter
/indexOf
type FilterWorthy<T> = ((x: T) => boolean)
| ((x: T, i: number) => boolean)
| ((x: T, i: number, arr: T[]) => boolean)
function myFunc<T>(someArray: T[], filterFnOrObj: T | FilterWorthy<T>) {
if (isFilterWorthy<T>(filterFnOrObj)) {
someArray.filter(filterFnOrObj)
} else {
someArray.indexOf(filterFnOrObj)
}
}
function isFilterWorthy<T>(x: T | FilterWorthy<T>): x is FilterWorthy<T> {
return typeof x === 'function'
}
const isEven = (x: number): boolean => x % 2 === 0
const alwaysTrue = <T,>(x: T, i: number, arr: T[]): boolean => true
const returnsBooleanButWrongParams = (x: number, arr: number[]): boolean => true
const returnsNumber = (): number => 1
const returnsObj = (): Record<string, unknown> => ({})
myFunc([1, 2], isEven) // OK
myFunc(['a'], alwaysTrue) // OK
myFunc([1, 2], returnsBooleanButWrongParams) // Error
myFunc([1, 2, 3], returnsNumber) // Error
myFunc([{a: 1}, {b: 2}], returnsObj) // Error
推荐阅读
- reactjs - 无法将我的网格卡内容设置为等高
- c# - 如何将列表的子集添加到另一个列表中对象的属性 - 最佳/最快实践
- amazon-web-services - ansible-playbook 是否使用先前创建的变更集(如果存在)还是使用 playbook 和 var 运行?
- c# - 本地存储 PC 应用程序数据并与服务器数据库同步的最佳方式
- firebase - Flutter 和 Cloud Firestore 如何访问 2 级类别列表
- java - 如何查找字符串是否包含字典中的单词?
- angular - 将变量设置为异步函数内的值
- python - 将字典保存为 pyspark 数据框并加载它 - Python、Databricks
- python - 如果我随机选择一个项目,如何为列表中的项目分配一个 ID?
- python - 如何在 python 中使用 webdriver 并行运行多个 Chrome 实例?