You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I often parse things such as API responses or other JSON decoded payloads with the allow_unknown_fields parameter set to true.
This allows me to be forwards compatible with any fields that may be added in the future, or lets me assert the rest of a shape conditionally based on other data.
But PHPStan thinks it knows the whole shape of an array with this code:
Type\shape(['foo' => Type\string()], allow_unknown_fields: true)->assert($body);
\PHPStan\dumpType($body); // Dumped type: array{foo: string}// Call to method Psl\Type\TypeInterface<array<string, string>>::matches() with array{foo: string} will always evaluate to false. if (Type\shape(['bar' => Type\string()], allow_unknown_fields: true)->matches($body)) {
\PHPStan\dumpType($body); // Dumped type: *NEVER*
}
I would expect a type like array&hasOffsetValue('foo', string) instead.
I tried digging into the code to see if I could offer a PR to add/fix this, but I have no clue how to achieve this 😅
The text was updated successfully, but these errors were encountered:
Just wanted to mention that I was able to work around this by explicitly including any other fields I want to use later on as optional in the original assert (which seems a pretty obvious workaround in hindsight):
But as the structure of the data gets more complex and contains many fields this would become very verbose contain a lot of duplication in all the checks.
Hi there,
I often parse things such as API responses or other JSON decoded payloads with the
allow_unknown_fields
parameter set totrue
.This allows me to be forwards compatible with any fields that may be added in the future, or lets me assert the rest of a shape conditionally based on other data.
But PHPStan thinks it knows the whole shape of an array with this code:
I would expect a type like
array&hasOffsetValue('foo', string)
instead.I tried digging into the code to see if I could offer a PR to add/fix this, but I have no clue how to achieve this 😅
The text was updated successfully, but these errors were encountered: