하지만 인수로 제공하는 콜백 함수의 매개변수에는 타입을 표기하지 않아도 됩니다. example 함수를 선언할 때 callback: (error: Error, result: string) => void로 콜백 함수에 대한 타입을 표기했기 때문에 (e, r) => {} 함수는 callback 매개변수의 타입으로 추론됩니다. 따라서 매개변수 e는 Error 타입이, 매개변수 r은 string 타입이 됩니다. 이런 현상을 문맥적 추론(Contextual Typing)이라고 부릅니다.
또한, 콜백 함수의 매개변수는 함수를 호출할 때 사용하지 않아도 됩니다. example(() => {})처럼 콜백 함수에 error 매개변수와 result 매개변수 자리가 없어도 호출할 수 있습니다. error 매개변수와 result 매개변수를 콜백 함수에서 사용하지 않을 뿐입니다.
여기서 많이 하는 실수가 괜히 error?과 result?처럼 옵셔널로 만들어버리는 것입니다. 옵셔널로 만들면 error와 result의 타입이 각각 Error | undefined, string | undefined가 되어버립니다. 아까 두 값이 undefined가 아니라는 점을 기억하라고 했죠? 옵셔널로 만들면 error와 result의 값이 undefined가 될 수 있으므로 의도와 달라집니다.
콜백 함수의 반환값이 void일 때는 어떠한 반환값이 와도 상관없습니다. 그래서 example(() => true)를 해도 에러가 발생하지 않습니다. 다만 해당 반환값은 다른 곳에 사용되지 않습니다.