Typescript:将对象 Literal 分配给类型化变量 / typeof 对象文本。两者都可能吗?

Typescript: Assign object Literal to typed variable / typeof object literal. Both possible?

提问人:Thomas 提问时间:9/3/2023 最后编辑:BehemothThomas 更新时间:9/3/2023 访问量:21

问:

给定类型:

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)并在有其他属性时引发错误?

TypeScript typeerror 鸭子类型

评论

1赞 MaximilianMairinger 9/3/2023
你是说不是?type MyLiteralType = typeof myValue2; // {A: number} const MyLiteralType = typeof myValue2; // {A: number}

答:

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}

(在线演示)