There's a couple of things going on that you might not be familiar with as it's a bit different to most languages:
The public modifier on these constructor parameters is actually introducing them as properties of the Student type:
constructor(public firstName: string, public middleInitial: string, public lastName: string) {}
Since the Student type has 'firstName' and 'lastName' properties, it meets the Person interface requirements. It doesn't need to declare that it is, but could and usually would just for readability and the additional assurance that you haven't forgotten something.
No, you don't need to inherit or implement which is one of the great features of TypeScript!
In this example, the `greeter` function accepts any object that has a `firstName` and `lastName` property defined, regardless of what the object/type is called. No need for inheritance.
In fact, the `Person` interface is not even emitted in the JS output because interfaces are only used at compile time, not at run time.
The public modifier on these constructor parameters is actually introducing them as properties of the Student type:
constructor(public firstName: string, public middleInitial: string, public lastName: string) {}
Since the Student type has 'firstName' and 'lastName' properties, it meets the Person interface requirements. It doesn't need to declare that it is, but could and usually would just for readability and the additional assurance that you haven't forgotten something.