I wrote this code below to show my problem
type MyFunction<T> = (req: string, res: number) => T;
interface ITest {
store: MyFunction<void>;
}
class Test implements ITest {
store(req, res) { //req, res got implicit any type
req.codePointAt()
res.toFixed()
}
}
Why when I implement my interface ITest on my class Test it still not being able to infer the params types ?
CodePudding user response:
store is not a function, is a property that has a type that is a function.
If you want to keep the type, you should declare it like so:
class Test implements ITest {
store: MyFunction<void> = (req, res) => {
req.codePointAt();
res.toFixed();
}
}
And now codePointAt wants a parameter :)
CodePudding user response:
I think this is what @jcalz meant, you still need to put the param and return type on the class method, but by implementing a interface, TypeScript will check whether the method have the same param and return type as the interface it implements
type MyFunction<T> = (req: string, res: number) => T;
interface ITest {
store: MyFunction<void>;
}
class Test implements ITest {
store(req: number, res: number): void {
}
}
that code will shows an error because req type is incompatible
Property 'store' in type 'Test' is not assignable to the same property in base type 'ITest'.
Type '(req: number, res: number) => void' is not assignable to type 'MyFunction<void>'.
Types of parameters 'req' and 'req' are incompatible.
Type 'string' is not assignable to type 'number'.
CodePudding user response:
An ITest.store must implement (req: string, res: number) => void;. Your Test's store method technically does that. Its signature is (req: any, res:any) => void. The any types both suffice for string and number.
When you use implements, your object/class/etc is agreeing to fulfill the interface's requirements. This means the interface isn't making any decisions about the types. Its the responsibility of the implementor. So back to above, Test agrees to implement the ITest interface. Its store method currently has a signature of (req: any, res: any) => void. Since any fulfills string and number it effectively fulfills the ITest interface.
