我想以这种方式指定类型,它的泛型参数应该是一个可以从 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/