提问人:Thomas 提问时间:9/3/2023 最后编辑:BehemothThomas 更新时间:9/3/2023 访问量:21
Typescript:将对象 Literal 分配给类型化变量 / typeof 对象文本。两者都可能吗?
Typescript: Assign object Literal to typed variable / typeof object literal. Both possible?
问:
给定类型:
type MyType = {
A: number | string
}
以下内容将引发错误(完全符合我的要求):
const myValue1: MyType = {
A: 123,
B: "Oh!", // raises a type error, because I accidentally defined the property B
}
另一方面,以下内容将为我提供对象文字的类型:
const myValue2 = {
A: 123
}
const MyLiteralType = typeof myValue2; // {A: number}
理想情况下,我希望两者兼而有之:
- 在分配给 myValue 时进行严格检查(不允许使用其他属性),以及
- 提取 myValue 的类型,因为我将其定义为 ab 对象文字 ({A: number})
我可以欺骗打字稿给我它,而不必显式定义第二种类型({A:number})吗?我没有想法。
似乎我只能有一个或另一个:
- 将对象文本分配给类型化变量并进行严格的类型检查,或者
- 提取对象文本的类型,但没有严格的类型检查(只有鸭子类型)。
也许我可以通过一些模板魔术来比较两种类型(MyType 和 MyLiteralType)并在有其他属性时引发错误?
答:
1赞
Bergi
9/3/2023
#1
这正是满足
运算符的目的:
type MyType = {
A: number | string
};
const myValue2 = {
A: 123
} satisfies MyType;
const myValue1 = {
A: 123,
B: "Oh!", // raises a type error, because I accidentally defined the property B
} satisfies MyType;
type MyLiteralType = typeof myValue2; // {A: number}
(在线演示)
评论
type MyLiteralType = typeof myValue2; // {A: number}
const MyLiteralType = typeof myValue2; // {A: number}