Telescope
Interfaces

Interfaces

To utilize polymorphic type fields(with '(cosmos_proto.accepts_interface)') generation, automatic wrapping/unwrapping, and type checking with the is function, configure as follows:

"interfaces": {
  "enabled": true,
  "useGlobalDecoderRegistry": true,
  "useUnionTypes": true
}

This configuration enables the generation of more expressive and type-safe TypeScript code, particularly for handling polymorphic types and improving runtime type checking.

Samples

1. Polymorphic Type Field Generation

When the tool encounters a field with the annotation (cosmos_proto.accepts_interface) = "Authorization", it generates a polymorphic type field. This means the field will be represented as a union type in the generated TypeScript code, allowing for more specific type handling.

For example, a field annotated in the .proto file will result in a TypeScript field like:

authorization: GenericAuthorization | DepositDeploymentAuthorization | Any;

2. Automatic Wrapping or Unwrapping

The tool automatically wraps or unwraps the polymorphic field when encoding or decoding. This process translates the specific TypeScript object into a generic Any type format for Protobuf and vice versa, without requiring manual conversion.

Encoding Sample:
const msg = MsgGrant.fromPartial({
  granter: address1,
  grantee: address2,
  grant: Grant.fromPartial({
    authorization: SendAuthorization.fromPartial({
      spendLimit: [{
        denom: denom,
        amount: "1000000",
      }],
    }),
  }),
});
 
// SendAuthorization will be wrapped into Any type when broadcasting
// client.signAndBroadcast(..., [ msg ], ...)
Decoding Sample:
const authsResults = await queryClient.cosmos.authz.v1beta1.granteeGrants({
  grantee: address2,
});
 
// auth's been unwrapped into SendAuthorization type from Any.
const auth = authsResults.grants[0].authorization;

3. The is Function

The is function is automatically generated for polymorphic types, allowing developers to check at runtime if a decoded object matches a specific type. This function enhances type safety by providing a straightforward way to assert the type of polymorphic fields.

Using the is Function:
if (SendAuthorization.is(auth)) {
  expect(auth.spendLimit[0].amount).toBe("1000000");
}

This example demonstrates how to use the is function to check if the authorization field is of the type SendAuthorization and then perform operations based on that check.