(?:[^/]|(?<!/)/(?!/))*МОСКВА(?:[^/]|(?<!/)/(?!/))*
[^\/]*
(?<=^|[.?!])(?![^.?!]*?\bslovo2\b[^.?!]+?\bslovo\b)[^.?!]*?\bslovo\b[^.?!]*
\b
перед/после них на (?<![a-zа-яё0-9])
или (?![a-zа-яё0-9])
соответственно.(?<=^|[.?!])
- перед началом искомого матча стоит конец пред. предложения или начало строки(?![^.?!]*?\bslovo2\b[^.?!]+?\bslovo\b)
- матч не содержит slovo2, после которого есть slovo[^.?!]*?\bslovo\b[^.?!]*
- матч содержит slovo Микро таски же должны быть в первую очередь после синхр кода ?
interface IStorageConfig<T, K> {
oftype: new () => IStorage<T, K>;
}
const matchStorageConfig: IStorageConfig<Match, number> = {
oftype: MatchStorage
}
const s = new matchStorageConfig.oftype();
{[K in keyof T]: ...}
- это специальный особый паттерн, где ты итерируешься по ключам "локального типа" внутри генерика (аналог локальной переменной внутри функции). Важен тот факт, что тип именно локальный - либо параметр генерика, либо что-то, извлеченное с помощью infer.type MappedGenericStringType1<T, Keys extends keyof T = keyof T> = {
[K in Keys]: any;
};
// или так
type MappedGenericStringType2<T> = keyof T extends infer Keys extends keyof T ? {
[K in Keys]: any;
} : never;
const array: Array<IQuest | IPost | IAlbum | IContest>;
array.forEach((item) => {
// сейчас item - IQuest | IPost | IAlbum | IContest
if (item.namespace === 'quest') {
// здесь item - IQuest, typescript сам об этом догадался по условию
} else if (item.namespace === 'post') {
// здесь item - IPost
} // и т.д.
})
type GetStrKeys<T> = keyof {[K in keyof T as T[K] extends string ? K : never]: T[K]};
type SortKeys = GetStrKeys<IPost>;
.......
const [selectedSort, setSelectedSort] = useState<SortKeys>(); // SortKeys | undefined;
const sortedPosts = useMemo(() => selectedSort
? [...posts].sort((a, b) => a[selectedSort].localeCompare(b[selectedSort]))
: posts,
[posts, selectedSort]
);
.....
<PostList posts={sortedPosts} sortPosts={setSelectedSort} remove={deletePost} />