Short answer: types are not needed in Typescript, but they're very welcome and useful!
When you import a javascript package, Typescript has no type definition for that lib, and therefore fall back to the any type.
const _ = require('lodash');
// _ is of type 'any'
When you import a typescript package, then the types are set and you're good.
But it would be so great to have types definition for javascript packages, to get all the help and tooling from Typescript, even for those non-typescript packages. That's why people started to create type-definition for these packages. But most of the package maintainer don't want to include these types in their packages, which makes sense since they're pure js package. So these type definitions end in other repos, and are not bundled with the lib itself.
The community gathered these under an umbrella project, and Definitely Typed was born.... hundreds of package type definition files!
Microsoft embraced this initiative and now even provide a tool to make the type search easier: https://aka.ms/types
And how to import these type definition, and what is the link with @types?
First there was a tool, tsd, which became deprecated and replaced by typings, who let you search and install type definition in your project. But it added another JSON file, typings.json and another subfolder in your project.
Then npmjs.org released the scope feature. Scope is a way to group packages. And it's very useful, even for pure JS projects. For instance your company could register to npmjs.org and host its own private package into a company scope, like @supercompany/package-a and @supercompany/package-b. You can learn more about npm scope in the documentation: https://docs.npmjs.com/misc/scope
Typescript leverage that scope feature to migrate (there's not yet all migrated AFAIK) type definition.
The regular package is unchanged. npm install lodash --save install the regular lodash javascript lib. Then npm install @types/lodash --save-dev install only the lodash type definition (the lodash code isn't there).
The great benefit is that now you don't have to install and use another tool than npm. Npm lets you install the javascript packages and their type definition, from the @types scope. No additional JSON file, everything is in package.json. And the type definition aren't stored in a new subfolder, but go into the usual node_modules.
To learn more about the move out of typings into npm @types scope, there's this great blog post in Typescript Developer Tools blog: The Future of Declaration Files