Typescript 修改类型以包含对象的静态值而不是其派生类型({test:3}而不是{test:number})
我正在尝试创建一个调色板,我想导出一个附加了所有颜色的对象,并获取它们的键入信息。由于每个键只能是一个值,我希望它们的类型将导出为该特定值。但是,当我简单地导出颜色集时,每个关键点都会变成一个字符串(而不是特定的值) 如果我做了以下事情,我就会得到我想要的。但是,每次添加颜色时,我都必须手动添加到类型中Typescript 修改类型以包含对象的静态值而不是其派生类型({test:3}而不是{test:number}),typescript,typescript-typings,Typescript,Typescript Typings,我正在尝试创建一个调色板,我想导出一个附加了所有颜色的对象,并获取它们的键入信息。由于每个键只能是一个值,我希望它们的类型将导出为该特定值。但是,当我简单地导出颜色集时,每个关键点都会变成一个字符串(而不是特定的值) 如果我做了以下事情,我就会得到我想要的。但是,每次添加颜色时,我都必须手动添加到类型中 export const red = "#FF0000"; export const tuna = "#36393F"; type enumInterface = { tuna:
export const red = "#FF0000";
export const tuna = "#36393F";
type enumInterface = {
tuna: typeof tuna;
red: typeof red;
};
const defaultExport: enumInterface = {
tuna,
red
};
// When I import this in another file the typing information
// shows the hexcode instead of type string. which is what I want
export default {
...defaultExport
};
我知道映射类型,所以我希望这样做,但它不起作用,因为t[p]不是一个值,而是一个类型
type testInterface<T> = {
[P in keyof T] : typeof T[P];
}
type testInterface={
[P in keyof T]:T的类型[P];
}
我希望有人知道如何实现与第二组相似的效果,但使用映射类型,这样我就不必键入每种类型。谢谢你的帮助 获取文本类型的最简单解决方案是只使用类型断言:
const defaultExport = {
tuna: "#36393F" as "#36393F",
red: "#FF0000" as "#FF0000"
};
如果要多次使用此模式(或有许多枚举成员),可以创建一个帮助器类来帮助构建枚举
class EnumBuilder<T = {}> {
private allValues: any;
end(): { [P in keyof T] : T[P]} {
return this.allValues;
}
add<TKey extends string, TValue extends string>(key: TKey, value: TValue): EnumBuilder<T & { [P in TKey]: TValue }>{
this.allValues[key] = value;
return this as any;
}
}
const defaultExport = new EnumBuilder()
.add('red', "#FF0000")
.add('tuna', "#36393F")
.end();
export default {
...defaultExport
};
类枚举生成器{
私人所有价值观:任何;
end():{[P in keyof T]:T[P]}{
返回此.allValues;
}
添加(键:TKey,值:TValue):EnumBuilder{
此.allValues[key]=值;
将此文件作为任何文件返回;
}
}
const defaultExport=新的EnumBuilder()
.add('red',“#FF0000”)
.加上(‘金枪鱼’,“#36393F”)
.end();
导出默认值{
…默认导出
};
class EnumBuilder<T = {}> {
private allValues: any;
end(): { [P in keyof T] : T[P]} {
return this.allValues;
}
add<TKey extends string, TValue extends string>(key: TKey, value: TValue): EnumBuilder<T & { [P in TKey]: TValue }>{
this.allValues[key] = value;
return this as any;
}
}
const defaultExport = new EnumBuilder()
.add('red', "#FF0000")
.add('tuna', "#36393F")
.end();
export default {
...defaultExport
};