Preheat oven to 350°F. Grease a 9×13-inch baking dish with butter or cooking spray.
Boil cubed sweet potatoes in salted water until completely fork-tender, about 15–18 minutes. Drain and let steam-dry in the colander for 2 minutes.
Mash the sweet potatoes in a large bowl until smooth. Add the softened butter and stir until melted and incorporated.
Stir in the brown sugar, vanilla, cinnamon, and salt. Let the mixture cool for 5 minutes.
Add the beaten eggs and milk, then stir until the filling is smooth and creamy. Spread evenly into the prepared baking dish.
Make the streusel: In a medium bowl, combine the flour, brown sugar, and cinnamon. Add the cold butter cubes and use your fingertips to work the butter into the mixture until it resembles coarse crumbles. Stir in the pecans.
Scatter the streusel evenly over the sweet potato filling.
Bake uncovered for 35–40 minutes, until the topping is golden and the filling has puffed slightly at the edges.
Let rest 5 minutes before serving.