如何在typescript中从JSON响应中简洁地写出类型中的许多变量



我有一个相对简单的问题,假设我需要从JSON响应创建一个新类型

我的JSON响应(我们称之为标签响应)如下

{
id1: "someString"
someField: "someString"
someMoreFields: "someString"
EvenMorefields: "someString"
EvenMoreMoreFields: "someString"
SoManyManyFields: "someString"
EndlessFields: "someString"
}

现在,如果我选择从这个响应中创建一个类型,它将如下所示(如果我错了请纠正我)

export type LabelResponse =
{
Fields: string;
FieldsMore:string;
MoreMoreFields:string;
MoreMoreMoreFields:string;
}

这是非常冗长的因为更多的id,我有更多的字段,我将需要和所有的id是相同的类型。

是否有可能将其简写,例如,在我的函数参数中,而不是为它声明类型

例如,不用

function myFunction(label:LabelResponse)

是否可以在参数括号中声明我的类型?这样的:

function myFunction(label:DeclareMyTypeHereSomehow?)

您可以创建一个Record类型,包括一个字符串键和一个值键,如下所示:

type LabelResponse = Record<string, string>
const data: LabelResponse = {
id1: "someString",
id2: "someString",
someRandomString: "someString",
someWeirdString: "someString",
}

游乐场

可以使用模板文字类型缩短类型定义,如下所示:

export type LabelResponse = { [K in `id${1|2|3|4}`]: string; }

这将给出一个类型:

type LabelResponse = {
id1: string;
id2: string;
id3: string;
id4: string;
}

操场。


或者如果你不关心实际范围,你可以使用id${number}:

export type LabelResponse = { [K in `id${number}`]: string; }
// errors since key doesn't start with id
const x:  LabelResponse = {
'x1': 'hello'
}
// works
const y: LabelResponse = {
'id2': 'world'
}
// not works since it expects a number after id
const z: LabelResponse = {
'idx': '!'
}

游乐场


如果你根本不关心键,那么你可以这样做:

type LabelResponse = {
[K: string]: string
}

相关内容

  • 没有找到相关文章