我有一个相对简单的问题,假设我需要从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
}