用于对象键映射的 Typescript 模板文字
Typescript template literal for object key mapping
我正在尝试创建一个通用类型,该类型将使用模板文字映射键。一般来说,我只希望通用类型中列出的所有键都出现在输出类型中,但稍作修改。大致如下:
type TFoobar = "foo" | "bar";
const foobar: TFlagDict<TFoobar> = {
"foo_flag": true,
"bar_flag": true
};
我试过这样实现它:
type TFlagDict<TProperties extends string> = {
[key in TProperties]: {[k in `${key}_flag`]: boolean}
}[TProperties]
虽然它确实有一个正确的类型,但它使属性成为可选的(至少一个是必需的,但没有任何东西强制它们都存在)
const foo: TFlagDict<TFoobar> = {
"foo_flag": true
}; //valid, shouldnt be
const bar: TFlagDict<TFoobar> = {
"bar_flag": true
}; //valid, shouldnt be
const foobar: TFlagDict<TFoobar> = {
"foo_flag": true,
"bar_flag": true
}; //valid
你很接近:
type TFoobar = "foo" | "bar";
const foobar: TFlagDict<TFoobar> = {
"foo_flag": true,
"bar_flag": true
};
type TFlagDict<TProperties extends string> = {
[key in TProperties as `${key}_flag`]: boolean // key remapping
}
type O = TFlagDict<TFoobar>
const foo: TFlagDict<TFoobar> = {
"foo_flag": true
}; //error
const bar: TFlagDict<TFoobar> = {
"bar_flag": true
}; //error
const foobar2: TFlagDict<TFoobar> = {
"foo_flag": true,
"bar_flag": true
}; //valid
您可以在迭代器中使用 as
。有关更多上下文,请参阅 docs
您可以使用 TFooBar
而不是 key
来强制执行此类验证:
type TFlagDict<TProperties extends string> = {
[key in TProperties]: {[k in `${TFoobar}_flag`]: boolean}
}[TProperties]
我正在尝试创建一个通用类型,该类型将使用模板文字映射键。一般来说,我只希望通用类型中列出的所有键都出现在输出类型中,但稍作修改。大致如下:
type TFoobar = "foo" | "bar";
const foobar: TFlagDict<TFoobar> = {
"foo_flag": true,
"bar_flag": true
};
我试过这样实现它:
type TFlagDict<TProperties extends string> = {
[key in TProperties]: {[k in `${key}_flag`]: boolean}
}[TProperties]
虽然它确实有一个正确的类型,但它使属性成为可选的(至少一个是必需的,但没有任何东西强制它们都存在)
const foo: TFlagDict<TFoobar> = {
"foo_flag": true
}; //valid, shouldnt be
const bar: TFlagDict<TFoobar> = {
"bar_flag": true
}; //valid, shouldnt be
const foobar: TFlagDict<TFoobar> = {
"foo_flag": true,
"bar_flag": true
}; //valid
你很接近:
type TFoobar = "foo" | "bar";
const foobar: TFlagDict<TFoobar> = {
"foo_flag": true,
"bar_flag": true
};
type TFlagDict<TProperties extends string> = {
[key in TProperties as `${key}_flag`]: boolean // key remapping
}
type O = TFlagDict<TFoobar>
const foo: TFlagDict<TFoobar> = {
"foo_flag": true
}; //error
const bar: TFlagDict<TFoobar> = {
"bar_flag": true
}; //error
const foobar2: TFlagDict<TFoobar> = {
"foo_flag": true,
"bar_flag": true
}; //valid
您可以在迭代器中使用 as
。有关更多上下文,请参阅 docs
您可以使用 TFooBar
而不是 key
来强制执行此类验证:
type TFlagDict<TProperties extends string> = {
[key in TProperties]: {[k in `${TFoobar}_flag`]: boolean}
}[TProperties]