interface A { a: () => boolean; } class AImpl implements A { public a(): boolean { return true; } } it('should fail', function () { const aImpl = new AImpl(); if (aImpl.a) { // TS2774: This condition will always return true since this function is always defined. Did you mean to call it instead? console.log("always true"); } }); it('why success', function () { const aImpl = new AImpl(); if (!aImpl.a) { // nothing happens here console.log('always false'); } }); ¿Por qué aImp.a informa TS2774, pero !aImpl.a funciona bien?
¿Y hay alguna forma de encontrar la propiedad sin referencia en una declaración de método?
Como señaló Ramesh Reddy en los comentarios, si llama a if(aImpl.a) , siempre devolverá true porque definió aImpl.a . Básicamente, convierte la referencia a esta función en un booleano que siempre será cierto porque la función está definida.
Lo que probablemente quería hacer es llamar a la función que implementó.
En otras palabras, if (aImpl.a()) .