typescript - 打字稿 - 默认参数类型“{}”不可分配给
问题描述
我已经为一个表单编写了一个简单的验证方法,它接受一个{ [name: string]: string }
值对象并返回具有错误消息的相同类型的部分,但是关于我的类型的某些东西不起作用 - 第三个E
类型的参数是错误的,除非我调用它any
与:
Type '{}' is not assignable to type 'E'
. 如果我没有提供类型信息(否as any
)。Cannot find name 'E'
如果我= {}
以:E
类型开头Type expected
如果我使用as E
export const requiredFields: <
T extends { [propName: string]: string },
K extends keyof T,
E extends Partial<T>
>(
fields: K[],
values: T,
startingErrors?: E
) => E = (fields, values, startingErrors: E = {}) =>
reduce(
fields,
(acc, fieldName) =>
values[fieldName].length
? acc
: Object.assign({}, acc, { [fieldName]: "Required" }),
startingErrors
)
解决方案
Typescript 不允许您将对象文字分配给泛型类型的变量。虽然泛型类型约束为该类型指定了一个最小契约,但可以想象该类型可以包含所需的属性(T
例如 的属性除外)。这意味着,由于 Typescript 无法证明该值对任何值都有效,E
因此它不会让您进行分配。
在您的情况下,最简单的解决方案是拥有一个公共通用签名和一个更简单的非通用实现签名。
export function requiredFields <
T extends { [propName: string]: string },
K extends keyof T,
E extends Partial<T>
>(
fields: K[],
values: T,
startingErrors?: E
):E
export function requiredFields(fields: string[], values: Record<string, string>, startingErrors: Record<string, string> = {}) :Record<string, string> {
return reduce(
fields,
(acc, fieldName) =>
values[fieldName].length
? acc
: Object.assign({}, acc, { [fieldName]: "Required" }),
startingErrors
)
}
declare function reduce<T, U>(arr: T[], a: (acc: U, e: T) => U, i: U): U;
推荐阅读
- ssl - JSF websocket url 在 ssl 端口上不起作用
- python - 我试图打开一个 csv 文件,但它没有加载 csv 文件,而是打印了它的 html 文档
- javascript - 如何使用 discord.js 在不和谐的特定频道中发送消息
- javascript - mailchimp 无效资源
- python - Python-mss 错误:无法使用抓取()在区域上截取屏幕截图
- flutter - Flutter 正确布局了 Row 的元素,但在控制台上给出 RangeError?
- reactjs - react-query:查询总是在获取
- python - 使用 Scrapy 时无法使用 w3lib.html 中的 remove_tags 删除 html 标签
- python-3.x - 在服务器上运行测试代码而不访问 Secret
- pingfederate - 链接 PingFederate 适配器