Насколько я понимаю в TypeScript string это примитив, а String это объект. Рассмотрим следующий код:
let s: string = new String("foo");// ERROR
let S: String = "foo";//OK
Почему бы нам не получить ошибку на второй строке. Мы показываем, что будем использовать строковый объект, но используем строковый примитив.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Первая строка выдаст ошибку, потому что вы пытаетесь присвоить тип в штучной упаковке примитивному типу, то есть более конкретно.
Во второй строке не будет ошибки, потому что вы конвертируете примитивный тип в упакованный тип, который является менее конкретный.
Возвращаясь к первой строке:
let s = new String("foo");
console.info(typeof s); // object
Описание ошибки вполне по делу:
'string' is a primitive, but 'String' is a wrapper object.
Вы все еще можете сделать это, если вы вводите утверждение: TypeScript проходит, а JavaScrip затем распаковывает переменная. Однако я не могу найти причину чего-либо подобного:
let s: string = new String("foo") as string; // OK
Интересно, что вы также можете использовать конверсии с немного похожим синтаксисом:
let s: string = String("foo"); // OK
console.info(typeof s); // string
Это особенно полезно при преобразованиях Boolean, например:
const objectExists = Boolean(someObjectThatMightNotExist);
console.info(typeof objectExists); // boolean
Связано: typescriptlang.org/docs/handbook/declaration-files/…