typescript - 递归克隆具有非对象值作为字符串的类型
问题描述
说我有这种类型:
{
a: number;
b?: string;
c: null | {
a1: boolean;
a2: {
b1: number;
}
}
}
我想从中创建一个具有完全相同结构的类型,但所有值(或叶子)都被替换为字符串,如下所示:
{
a: string;
b?: string;
c: null | {
a1: string;
a2: {
b1: string;
}
}
}
这甚至可能吗?此外,是否可以创建它的部分类型,其中并非所有键都是必需的(我知道Partial
存在)。
解决方案
您可以结合使用条件类型和递归类型来做到这一点:
type Stringify<T> = { [key in keyof T]: T[key] extends object | null ? Stringify<T[key]> : string }
正在使用:
interface Thing {
a: number;
b?: string;
c: null | {
a1: boolean;
a2: {
b1: number;
}
}
}
const t: Stringify<Thing> = {
a: "foo",
b: "bar",
c: {
a1: "baz",
a2: {
b1: "qux",
},
},
};
推荐阅读
- regex - 包含在 Apache 免费标记中
- neo4j - 模拟 Neo4j 结果的临时视图
- html - 在 html/css 中选择列表项的问题
- python - 文件未在开发中显示
- python - 将 CSV 文件数据与文本文件数据匹配
- sql - SQL 中的两个表内连接产生的 SQL 表的最大大小是多少?
- html - 尝试使用 CSS 将 div 向右对齐
- python - pandas concat 但从左侧 df 获取重复的键行
- javascript - 在 JS 脚本中显示数据库信息
- heroku - 为什么即使 url 是正确的前端和后端,Heroku 也会返回 Cannot GET?