有没有办法在 Typescript 中将字符串解析为 JSON。
示例:在 JS 中,我们可以使用 JSON.parse()
。 Typescript中是否有类似的功能?
我有一个 JSON 对象字符串,如下所示:
{"name": "Bob", "error": false}
原文由 ssd20072 发布,翻译遵循 CC BY-SA 4.0 许可协议
有没有办法在 Typescript 中将字符串解析为 JSON。
示例:在 JS 中,我们可以使用 JSON.parse()
。 Typescript中是否有类似的功能?
我有一个 JSON 对象字符串,如下所示:
{"name": "Bob", "error": false}
原文由 ssd20072 发布,翻译遵循 CC BY-SA 4.0 许可协议
JSON.parse
您可以继续使用 JSON.parse
,因为 TypeScript 是 JavaScript 的 超集:
这意味着您可以将任何有效的 JavaScript 代码放入 TypeScript 文件中,而不必担心它的具体编写方式。
留下了一个问题: JSON.parse
返回 any
,这破坏了类型安全( 不要使用 any
)。
以下是更强类型的三种解决方案,按复杂性升序排列:
// For example, you expect to parse a given value with `MyType` shape
type MyType = { name: string; description: string; }
// Validate this value with a custom type guard (extend to your needs)
function isMyType(o: any): o is MyType {
return "name" in o && "description" in o
}
const json = '{ "name": "Foo", "description": "Bar" }';
const parsed = JSON.parse(json);
if (isMyType(parsed)) {
// do something with now correctly typed object
parsed.description
} else {
// error handling; invalid JSON format
}
isMyType
称为 类型保护。它的优点是,您可以在 truthy if
分支中获得一个完全类型化的对象。
JSON.parse
包装器在 JSON.parse
周围创建一个通用包装器,它将一个类型保护作为输入并返回解析的、类型化的值或错误结果:
const safeJsonParse = <T>(guard: (o: any) => o is T) =>
(text: string): ParseResult<T> => {
const parsed = JSON.parse(text)
return guard(parsed) ? { parsed, hasError: false } : { hasError: true }
}
type ParseResult<T> =
| { parsed: T; hasError: false; error?: undefined }
| { parsed?: undefined; hasError: true; error?: unknown }
使用示例:
const json = '{ "name": "Foo", "description": "Bar" }';
const result = safeJsonParse(isMyType)(json) // result: ParseResult<MyType>
if (result.hasError) {
console.log("error :/") // further error handling here
} else {
console.log(result.parsed.description) // result.parsed now has type `MyType`
}
safeJsonParse
可能扩展为 快速失败 或 try/catch JSON.parse
错误。
如果您需要验证许多不同的值,手动编写类型保护函数会变得很麻烦。有一些图书馆可以协助完成这项任务——例子(没有完整的列表):
io-ts
: 有 fp-ts
对等依赖,使用函数式编程风格zod
:力求比 io-ts
更 程序化/面向对象---typescript-is
: 编译器 API 的 TS 转换器,需要像 ttypescript 这样的额外包装器typescript-json-schema
/ ajv
:从类型创建JSON模式并使用 ajv
更多信息
原文由 ford04 发布,翻译遵循 CC BY-SA 4.0 许可协议
9 回答10.2k 阅读
4 回答8.6k 阅读✓ 已解决
7 回答10.7k 阅读
2 回答11.2k 阅读✓ 已解决
6 回答2.4k 阅读
5 回答4.2k 阅读✓ 已解决
4 回答2.5k 阅读✓ 已解决
Typescript 是 javascript(的超集),因此您只需像在 javascript 中一样使用
JSON.parse
:只有在打字稿中,您才能对结果对象进行类型:
( 操场上的代码%3B%0D%0Aconsole.log(obj.myString)%3B%0D%0Aconsole.log(obj.myNumber)%3B))