json - 如何定义与 JSON 兼容的参数以避免错误“索引签名丢失”?
问题描述
我有一个函数定义为:
export function useSubmitHandler(url: string, data: Json): [FormEventHandler<HTMLFormElement>, boolean] {}
在哪里Json
:
type JsonPrimitive = string | number | boolean | null | undefined
interface JsonMap extends Record<string, JsonPrimitive | JsonArray | JsonMap> {}
interface JsonArray extends Array<JsonPrimitive | JsonArray | JsonMap> {}
export type Json = JsonPrimitive | JsonMap | JsonArray
但是,如果我尝试使用任意接口调用它,则会出现错误:
TS2345: Argument of type 'Fee' is not assignable to parameter of type 'Json'.
Type 'Fee' is not assignable to type 'JsonMap'.
Index signature is missing in type 'Fee'
但是,如果我用同一个对象调用它但像这样传播,{...store.data}
那么错误就会消失。
如何useSubmitHandler
正确键入以便它接受任何 JSON 可字符串化的对象?
我认为Json
类型是正确的,但它需要更多的东西来允许将任意类型传递给函数。
Fee
是:
interface Fee {
id: number|null;
name: string;
type: string;
amount: string;
default: number;
company_id: number;
deleted_at?: any;
active: number;
fee_or_discount: string;
}
当然,我希望它适用于任何类型。
解决方案
选项 1:重新定义Json
类型
type JsonPrimitive = string | number | boolean | null;
type JsonMap = {
[key: string]: JsonPrimitive | JsonMap | JsonArray;
}
type JsonArray = Array<JsonPrimitive | JsonMap | JsonArray>;
type Json = JsonPrimitive | JsonMap | JsonArray;
Fee
选项 2:向接口添加索引签名
interface Fee {
[property: string]: any;
id: number|null;
name: string;
type: string;
amount: string;
default: number;
company_id: number;
deleted_at?: any;
active: number;
fee_or_discount: string;
}
选项 3:为索引签名添加内联类型断言,例如:
useSubmitHandler(Router.route('fees.store')!, store.data as {[property: string]: any})
也可以看看
TypeScript GitHub 问题请提供json
基本类型 #1897
推荐阅读
- python - 如何将二维数组与块大小连接起来
- c# - Azure 媒体播放器是否支持画中画模式?
- php - 使用 APC 缓存大量结果页面,有什么缺点吗?
- bash - 带有 2 个用户输入变量的 bash 脚本不起作用
- sql - 接受用户的员工编号从“员工”表中获取员工详细信息并将其存储到 PLSQL 记录类型变量并打印相同
- flutter - Github 操作无法从私有仓库获取 pub 包
- angular - 在 PrimeNG 组件中全局设置默认属性
- node.js - 如何在使用 nodeJS 发送文件时使用 ReactJS 下载文件?
- angular - Typescript - 使用基本接口作为泛型类型
- javascript - 解析 Firebase 模块(React-Native)