typescript - 对象只能从 json 解析

标签 typescript generics

我想以这种方式指定类型,它的泛型参数应该是一个可以从 json 解析的对象。所以没有函数,没有日期,没有其他类型的值不能用 json 表示。我怎样才能做到这一点?

Example :

function get<T>(url: string): Promise<T> {
    return fetch(url).then(resp => resp.json())
}

interface Type1 {
    x: string;
}

interface Type2 {
    x: string;
    getX(): string;
}

interface Type3 {
    x: Date;
}

interface Type4 {
    x: {
        a: number[];
        b: { z: (string | null)[] };
    };
}

async function main() {
    var a = await get<Type1>("/")
    var b = await get<Type2>("/") // Want a error
    var c = await get<Type3>("/") // Want a error
    var d = await get<Type4>("/")
}

最佳答案

尝试为您想要的类型创建一个接口(interface),指定所有有效类型的联合,如下所示:

interface IJson {
    [key: string]: number | string | boolean | Array<number | string | boolean | IJson | null> | IJson | null;
}

编辑 : 经过一番研究,TypeScript 实际上在他们的 docs 上提供了一个完全一样的例子。 .他们推荐这个:
type Json =
    | string
    | number
    | boolean
    | null
    | { [property: string]: Json }
    | Json[];

编辑 2 :查看我的更新(来自您的)sandbox玩弄这些东西。不幸的是,似乎不可能将接口(interface)参数传递给 T 除非接口(interface)也有索引签名,例如 { [key: string]: string } .您应该能够通过将接口(interface)更改为类型定义来解决此问题,例如 type Type1 = { x: string }然后应该可以正常工作。我知道这不是您正在寻找的东西,但我不确定 TypeScript 目前(或将来)是否支持它。

关于typescript - 对象只能从 json 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61100695/

相关文章:

typescript - Sequelize 更新不接受 `null` 作为 typescript 的属性

Angular - View 绑定(bind)到数组未更新

java - 如何使用 Java 泛型两次扩展构建器类?

c# - 如何解决 - 无法使用 Automapper 将 Generic.List 转换为 Linq.IQueryable?

c# - 通用约束和接口(interface)实现/继承

javascript - 如何在传递 Prop 时使用 TypeScript 实现 "as" Prop ?

javascript - 如何实现存储库以整洁架构?

javascript - 将一种数据结构转换为另一种数据结构 JavaScript/TypeScript

c# - C# 泛型如何影响具有原语的集合

generics - Kotlin 外投影类型禁止使用