Pact 'like'匹配器是否关联TypeScript类型?
Pact
like匹配器是否与TypeScript类型关联? 问题场景
定义了如下TypeScript类型:
type TestType = { field1: string | number; field2: TestType2 } type TestType2 = "option1" | 'option2'
并通过以下代码生成匹配器:
const testData:TestType = { field1: 'stringValue', field2: 'option1' } const matcher = MatcherV3.like(testData)
原本期望提供者验证时,field2仅接受'option1'和'option2',但实际任意字符串都能通过,因此疑惑:Pact的like匹配器是否仅基于示例值推断类型,而非关联TypeScript类型?
解答
Pact的like匹配器和TypeScript类型没有任何关联,它只认运行时的示例值类型。
原因很简单:TypeScript的类型是纯编译时概念,编译后会被完全擦除,运行时根本不存在TestType2这种字面量联合类型的信息。你传入testData里的field2值是'option1',运行时它就是一个普通字符串,所以like匹配器只会识别出这是字符串类型,自然允许任意字符串通过验证。
如果要实现你期望的「仅接受指定字面量」的校验,得用Pact专门的枚举匹配器,而不是like,示例代码如下:
const matcher = { // 若要支持string | number的联合类型,需用or匹配器组合两种类型的匹配器 field1: MatcherV3.or( MatcherV3.like('stringValue'), MatcherV3.like(123) ), // 用enum匹配器限定允许的字面量值 field2: MatcherV3.enum(['option1', 'option2']) }
内容的提问来源于stack exchange,提问作者hyun chae
相关产品推荐
相关产品推荐

