我想把常量的类型和使用它"as const"来获取文本类型作为类型结合起来:
type MyType = {name: string};
const x:MyType = {
name: 'test' // Autocompleted, typesafe. But Type is {name: string}, not
// what I want, {name: 'test'}
}
const x = { name: 'test' } as const; // Gives correct type, but no type check...
如何做到这一点?
3条答案
按热度按时间lymnna711#
编辑2022年9月:
在Typescript 4.9中,我们现在可以使用
satisfies
运算符:如果由于某种原因,您不能使用
satisfies
,那么复制相同的行为是相当容易的:以前的解决方案:
以下是实现您所需的方法:
xxhby3vn2#
不需要对
{name: "test"} as const
进行类型检查,因为Typescript使用结构相等,这意味着只要{name: "test"} as const
是MyType的相同结构,它们就相等,因此相同。使用这些辅助类型可以观察到这种行为。
任何接受MyType的东西都可以接受Test类型。
编辑:如果你想强制test为MyType类型,以在那里对test进行类型检查,你不能通过保留字符串文字来做到这一点,因为任何Assert为MyType的东西都将失去文字类型,并退回到字符串。
这意味着如果你想在MyType上同时拥有Literal和string类型,你需要做一些类似的事情(改变MyType)。注意使用这个看起来很冗长,但是可以说比“as const”更简单。
^允许字符串和文本类型。
biswetbf3#
我不认为有任何原语支持。但是你可以通过定义另一个带有类型Assert的常量来做类型检查。
注意:我使用'typeof'来避免引用x的值,这确保了如果没有任何其他引用,x的值可以被删除。