Ambient simply means "without implementation".
Ambient declarations only exist in the type system and are erased at run-time:
// ambient module declaration
declare module "mymod" { /*... */ }
// ambient namespace declaration
declare namespace MyNamespace { /*... */ }
// ambient variable declaration
declare const myVar: string;
For example declare const myVar: string is like a promise to the compiler: "Assume that there will be a const myVar with type string defined at run-time" (other cases analogue).
You also can think of ambient as the declare keyword in TS. All type declarations like interfaces or type aliases are implicitly ambient by definition, as it is clear for the compiler, that these have no run-time impact.
declare type MyType = {a: string} // is valid
type MyType = {a: string} // shorter, so just leave "declare" out
"A function implementation cannot be declared in an ambient context."
As said, ambient declarations cannot contain run-time code, like:
declare module "mymod" {
function foo() { // error: An implementation cannot be declared in ambient contexts.
console.log("bar")
}
}
Given "mymod" is a npm package, the implementation code would rather be in the main .js file under "node_modules/mymod", and above types reside in a separate .d.ts file.