javascript - 无法使打字稿打字匹配
问题描述
我无法使以下代码正常工作。
我正在尝试获取一些数据并处理所有虚假/错误情况,然后将清理后的数据传递给另一个函数。但是当我调用第二个函数时,打字似乎不匹配。
输入“错误 | number[]' 不可分配给类型 'number[]'
interface SomeType {
a: number[] | null | Error
b: number[] | null
}
type Omit <T, K> = Pick<T, Exclude<keyof T, K>>
type ExcludeUnusableValues<T,K extends keyof T,C = Error | null>
= Omit<T, K> & {
[a in K]-? : Exclude<T[a], C>
}
function fetchData() {
const obj: SomeType = {
a: [1, 2, 3],
b: null
}
if (obj.a === null || obj.a instanceof Error) {
return null
}
// Type 'Error | number[]' is not assignable to type 'number[]'
useData(obj)
}
function useData(param1: ExcludeUnusableValues < SomeType, 'a' > ) {
console.log(param1)
}
解决方案
您可以通过将类型检查逻辑移动到类型谓词中来解决此问题。这是您的示例,修改为isUsableType
:
interface SomeType {
a: number[] | null | Error
b: number[] | null
}
function isUsableType(obj: SomeType): obj is ExcludeUnusableValues < SomeType, 'a' > {
return obj.a!==null && !(obj.a instanceof Error)
}
type Omit <T, K> = Pick<T, Exclude<keyof T, K>>
type ExcludeUnusableValues<T,K extends keyof T,C = Error | null>
= Omit<T, K> & {
[a in K]-? : Exclude<T[a], C>
}
function fetchData() {
const obj: SomeType = {
a: [1, 2, 3],
b: null
}
if (isUsableType(obj)) {
useData(obj)
} else return null;
}
function useData(param1: ExcludeUnusableValues < SomeType, 'a' > ) {
console.log(param1)
}
推荐阅读
- html - 每个锚点都指向同一个链接
- docker - 针对服务器运行自动化测试和在服务器上运行测试之间的区别
- python - 如何更改seaborn中堆叠条的顺序?并非全部可见,一些条形覆盖了其他条形
- android - 颤振连接android设备任务':app:stripDebugDebugSymbols'执行失败
- javascript - 在单元测试中忽略布尔值
- azure-powershell - 为什么 Get-AzDataFactoryV2PipelineRun 不返回 InProgress 管道运行?
- node.js - 在 Heroku [Node.js/React] 上部署 Socket.io 网站时出错
- javascript - 全局变量干扰其他代码我想将它作为局部变量放入这些函数中,使其全部放入 1 个大函数中
- zipkin - 配置 OpenTelemetry Collector 以导出 Zipkin 跟踪
- django - 是否有使用可扩展过滤器创建 Django 查询的最佳实践?