https://github.com/pandas-dev/pandas/pull/37268 fixed a bug so that nullable string dtype can now be cast to numeric from "number-like" strings and NA, however the output dtype is currently float64. Better would be for this to cast to either nullable Int64 or Float64 depending on the values. Below is master:

[ins] In [2]: import pandas as pd
         ...:
         ...: s = pd.Series(["1", "2", None], dtype="string")
         ...: print(pd.to_numeric(s))
         ...:
         ...: s = pd.Series(["1", "2.5", None], dtype="string")
         ...: print(pd.to_numeric(s))
         ...:
0    1.0
1    2.0
2    NaN
dtype: float64
0    1.0
1    2.5
2    NaN
dtype: float64

The first case would ideally cast to Int64, and the second to Float64.

Comment From: jorisvandenbossche

Looking at the maybe_convert_numeric implementation in lib.pyx, I think this involves keeping track of a mask array as well (now a null is written as NaN in the float array).