What are the differences between the following?
type Foo = { 
    foo: string 
};
interface Foo {
   foo: string;
}
What are the differences between the following?
type Foo = { 
    foo: string 
};
interface Foo {
   foo: string;
}
 
    
    Interfaces can be extended
interface A {
  x: number;
}
interface B extends A {
  y: string;
}
and also augmented
interface C {
  m: boolean;
}
// ... later ...
interface C {
  n: number;
}
Type aliases, however, can represent some things interfaces can't
type NumOrStr = number | string;
type NeatAndCool = Neat & Cool;
type JustSomeOtherName = SomeType;
So in general if you just have a plain object type, as shown in your question, an interface is usually a better approach. If you find yourself wanting to write something that can't be written as an interface, or want to just give something a different name, a type alias is better.
 
    
     
    
    Putting things in perspective
let myAge = 25;
let totalStatesInMyCountry = 25
Look both the variables are equal, that is (myAge === totalStatesInMyCountry) but their context is totally different.
This is similar case for typescript's types and interfaces. Look for Foo
type Foo = {
    text: string
};
interface Foo {
    text: string;
}
Foo as a type and as an interface looks same, similar to (myAge === totalStatesInMyCountry), but this is just special case. Their context is totally different.
When to think about interface instead of types?
You are enforcing that this class must have these methods. You are thinking about interfaces not types.
You want to create multiple implementation of same contract. Like for contract toHumanReadableNumber(number) different implementations needed are 100000 -> 100,000, 100000 -> 100K and 100000 -> 100 Thousands. Lets say you are solving this problem by creating different classes for each requirement. You are thinking about classes and interfaces and not classes and types
Interfaces are there to make system loosely coupled like implementing SOLID principles.
Interfaces are substitute to multiple inheritances. A class can only inherit from single class, but can have multiple interfaces.
For a class Point{ x:number,y:number, distanceFromCenter():number} , in context of interfaces, only distanceFromCenter():number matters.
----------x----------
Old Answer (before 31st Dec 2022)
Differences between these too are already in this thread.
type Foo = {
    foo: string
};
interface Foo {
    foo: string;
}
Here type Foo andinterface Foo looks almost similar so its confusing.
interface is contract that the following properties (herefoo:string) should be there in a object.
interface is not class. It is used when language does not support Multiple Inheritance. So interface can be a common structure between different classes.
class Bar implements Foo {
    foo: string;
}
let p: Foo = { foo: 'a string' };
Buttype and interface are used in very different context.
let foo: Foo;
let today: Date = new Date();
Here type of foo is Foo and today is Date.
Its like a variable decleration which holds the information of typeof other variable.
type is like a superset of interfaces, classes, function signature, other types or even values (like type mood = 'Good' | 'Bad').
At the end type describes the possible structure or value of a variable.
 
    
    It is wrong to say "Interfaces can be implemented" since types can also be implemented
type A = { a: string };
class Test implements A {
    a: string;
}
Although you can do this, you can't implement a type that is a Union of types, which makes totally sense honestly :)
 
    
    Types is kinda like Interfaces and vice versa: both can implemented by a class. but there are some important differences: 1. when Type is implemented by a class, the properties which belong to the Type must be initialized inside the class, whereas with Interface they must be declared. 2. as @ryan mentioned : Interface can extend another Interface. Types cannot.
type Person = {
    name:string;
    age:number;
}
// must initialize all props - unlike interface
class Manager implements Person {
    name: string = 'John';
    age: number = 55;
    // can add props and methods
    size:string = 'm';
}
const jane : Person = {
    name :'Jane',
    age:46,
    // cannot add more proprs or methods
    //size:'s'
}
 
    
    type in the typescript is used to reference already existing types. It can not be extended like interface. Examples of type are:
type Money = number;
type FormElem = React.FormEvent<HTMLFormElement>;
type Person = [string, number, number];
you can use Rest and Spread in types:
type Scores = [string, ...number[]];
let ganeshScore = ["Ganesh", 10, 20, 30]
let binodScore = ["Binod", 10, 20, 30, 40]
Interface, on the other hand, allows you to create a NEW TYPE.
interface Person{
  name: string,
  age: number, 
}
Interface can be extended with extends keyword.
interface Todo{
  text: string;
  complete: boolean;
}
type Tags = [string, string, string]
interface TaggedTodo extends Todo{
 tags: Tags
}
 
    
    Also, an interface can be implemented.
