gpt4 book ai didi

typescript 无法识别条件

转载 作者:行者123 更新时间:2023-12-04 02:27:11 25 4
gpt4 key购买 nike

我有以下代码:

type HTTPGet = {
url: string
params?: Record<string, unknown>
result: unknown
}
export const httpGet = <D extends HTTPGet>(url: D['url'], params: D['params'] = undefined): Promise<D['result']> => {
let path = url
if (params !== undefined) {
path += '?' + toHTTPQueryString(params);
}
return fetch(path, {
method: 'GET',
credentials: 'include',
headers: {
'Accept': 'application/json'
}
})
}

条件后params !== undefined我调用 toHTTPQueryString,它只接受 Record 类型。但是我遇到了 TypeScript 错误:

TS2345: Argument of type 'D["params"]' is not assignable to parameter of type 'Record<string, unknown>'.   Type 'Record<string, unknown> | undefined' is not assignable to type 'Record<string, unknown>'.     Type 'undefined' is not assignable to type 'Record<string, unknown>'.

为什么我会收到这条消息? TypeScript 应该明白我有条件 params !== undefined并且只剩下 Record<string, unknown>类型,可分配给 toHTTPQueryString参数类型。

最佳答案

这很有趣。正确地细化类型显然是 Typescript 的“错误”。

错误归结为 typescript 如何评估类型保护。考虑这两个用户定义的类型保护。他们都进行相同的检查,但他们对签名的定义不同。

const isDefined1 = <T extends any>(value: T | undefined): value is T => { 
return value !== undefined;
}
const isDefined2 = <T extends any>(value: T): value is Exclude<T, undefined> => {
return value !== undefined;
}
if (isDefined1(params)) {
path += '?' + toHTTPQueryString(params); // error
}
if (isDefined2(params)) {
path += '?' + toHTTPQueryString(params); // no error
}

isDefined2说“value 的类型现在不包括 undefined ”。这个有效。

isDefined1最接近模仿 Typescript 使用自动类型保护所做的事情 params !== undefined .它说“如果 value 的类型是与 undefined 的联合,则从联合中删除 undefined。”这个不起作用,并给出与您之前遇到的相同的错误。类型还是D['params']其中仍然包括 undefined .

失败是因为D是通用的,所以 D['params'] 的实际类型未知。我们知道它extends Record<string, unknown> | undefined但我们不知道它到底是什么。所以 Typescript 并没有真正对其进行全面评估。它不将其视为联合并删除 undefined因为实际类型可能不是联合。

如果您的函数定义了 params没有泛型的参数为 Record<string, unknown> | undefined那么这两个函数都可以工作,原来的params !== undefined也会起作用。

但就目前而言,您可以使用 isDefined2保护值(value)。

Typescript Playground Link

作为旁注,我很惊讶您在分配默认值 undefined 时没有收到任何错误。论点 params: D['params']自具体D类型可能不允许 undefined .

关于 typescript 无法识别条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66724520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com