Note that because GraphQL supports interfaces a resolver may return items of different types. For this reason, we key the fields by the GraphQL type name of the various fragments that were requested into the fieldsByTypeName field.
Once you know which specific type the result is going to be, you can then use this type (and its interfaces) to determine which sub-fields were requested - we provide a simplifyParsedResolveInfoFragmentWithType helper to aid you with this. In many cases you will know what type the result will be (because it can only be one type) so you will probably use this helper heavily.