JSON-RPC spec supports string, number, boolean, null, but the Ethereum JSON-RPC API does not (I believe). For most of its payloads it only supports numbers hex encoded as a string. I think there are a few places where it accepts/excepts an actual number, but it is unclear where these are other than by poking at it.
If this is going to be a thin wrapper around the Ethereum JSON-RPC API then you are right, it is probably best to have params in ethereum.send just be an Array<any>.
// JSON-RPC requests
ethereum.send(method, params): Promise<result: Object?, error: Error?>
I think this should change to
// JSON-RPC requests
ethereum.send(method: string, params: Array<any>): Promise<any>;
Note in particular that it returns a promise of any. If an error occurs during processing, then the promise will be rejected with an Error from the provider. If an error comes back from the JSON-RPC API call, then response.error will be wrapped in a JS Error and the promise rejected with that. If no errors occurs then the promise will resolve with whatever was in the JSON-RPC response.result. (all of this should be spelled out clearly using MUST wording like:
If the Ethereum JSON-RPC API returns response object that contains an error property then the Promise MUST be rejected with an Error object containing the response.error.message as the Error message, response.error.code as a code property on the error and response.error.data as a data property on the error.
If an error occurs during processing, such as an HTTP error or internal parsing error then the Promise MUST be rejected with an Error object containing a human readable string message describing the error and SHOULD populate code and data properties on the error object with additional error details.
If there is no error on the response and there is a result on the response then the promise MUST resolve with the response.result object untouched by the implementing wrapper.
Though, after typing the above I realize that some providers may not be interfacing with an external JSON-RPC API provider and instead may be fulfilling requests themselves, so someone should probably reword that to indicate that the above apply only if your provider is wrapping external calls, and if your wrapper is not talking to an external JSON-RPC API provider then it should ensure that the promise is rejected with an Error that matches the above shape in the case of an error or it should resolve with an object that matches the JSON-RPC API object as specified in the Ethereum JSON-RPC documentation.