<Card<Card key={card.keyId}
-90|-89|-88|...
преподавателю это может не понравиться
И threads ноды - это не чистая многопоточность. В браузере тоже воркеры есть.
Я специально отсеял юнионы, иначе у тебя на выходе будет не строка и ты не сможешь просто так использовать методы строки, что очевидно.
type ObjStr<T> = {[K in keyof T as T[K] extends string ? K : never]: T[K] & string};
Там в компоненте DivWithBug нет перескакивания курсора, потому что при печатании хотя и делается ререндер, но в children компонента < div contentEditable > передается один и тот же текст "Edit me.". Соответственно, когда после ререндера VDOM применяются изменения к DOM, то в этот див не ставится новое содержимое, т.к. у старого и нового VDOM оно не поменялось (DOM меняется точечно в тех местах, где обнаружились расхождения виртуальных деревьев, в этом вся суть).
Если сделать содержимое дива управляемым - вместо текста "Edit me." поместить туда {input} - то баг имеет место. Ссылка
Как именно реакт заменяет текстовое значение, сказать не могу, но положение курсора при этом не сохраняется, и реакт не заботится специально, чтобы его сохранить.