TBody
в таком случае должен стать дженериком.type TUserInfo = {
id: num,
readonly fname: string,
readonly lname: string
}
type TBody<T> = {
success: boolean,
user?: T
}
const fechUserInfo = (): Promise<TBody<TUserInfo>> => {
return fetch().then(response => response.json()).then((user: TUserInfo) => ({success: true, user}));
}
const isHtmlElement = (v: any): v is HTMLElement => v instanceof HTMLElement;
const eventHandler = (e: Event) => {
if (!isHtmlElement(e.target)) {
return;
}
// Вот здесь мы можем смело работать с таргетом как с ДОМ Элементом
e.target.classList.toggle('active');
}
type union = 'a' | 'b' | 'c'
type I = {
someOtherField?: number;
} & Record<union, any>;
// result:
interface I {
someOtherField?: number;
a: any
b: any
c: any
}
someOtherField
из примера), то можно обойтись просто Record<union, string>
. Как-то так:type I = Record<union, any>;
game$.subscribe((action) => {
switch (action[0]) {
case 'ArrowUp':
if(state.y > 0) { state.y--; }
break;
case 'ArrowRight':
if(state.x < gameWidth - 1) { state.x++; }
break;
case 'ArrowDown':
if(state.y < gameHeight - 1) { state.y++; }
break;
case 'ArrowLeft':
if(state.x > 0) { state.x--; }
break;
}
state.walls = action[1];
renderGame(state);
console.log(state)
});
// Класс здесь не нужен. Старайтесь предпочитать интерфейсы классам если у объекта нет методов
export interface NameSurName {
name: string;
surname: string;
}
...
this.nameSurName = {
name: '',
surename: 'Иванов',
...resp.data
}
let get = () => {
return this.http.get(url)
.subscribe((response: ResponseObject) => {...});
}
let get = () => {
return this.http.get(url)
.pipe(
tap((response: ResponseObject) => {...})
);
}
// а дальше где-то в коде сделать
service.get().subscribe((response: ResponseObject) => {...})
service.get()
.pipe(
tap(...),
map(...),
whatever(...),
).subscribe((response: ResponseObject) => {...})
const observable = service.get();
observable.subscribe((result) => {...}); //выполнит запрос к серверу
observable.subscribe((result) => {...}); //выполнит запрос к серверу еще раз
// запрос к серверу будет инициироваться каждый раз когда будет выполняться функция subscribe
public async handler(id: string, valueSearch: string) {
await this.request(id)
.then((array: faceProductList[]) => {
...
public async request(id: string): Promise<faceProductList[][]> {
const res = await fetch(`${this.url}${id}`);
const resArr: faceProductList[] | faceProductList[][] = await res.json();
if (resArr.length === 0) {
return resArr;
}
if (Array.isArray(resArr[0])) {
return resArr;
}
return [resArr];
}
axios.get<Room[]>('somepath/kek:1488?SeigHeil&joking=true')...
public getAll(): Promise<Room[]> {
return axios.get<Room[]>('somepath/kek:1488?SeigHeil&joking=true')
.then(response => response.data)
.catch(err => console.log(err))
}
// global.d.ts
declare function ConfigService();
// Да, сначала мы делаем map, потому что он делается полюбому:
let doSomething$ = this.myApi.getSomething(id).pipe(
map(tags => ({ ...updatedShop, tags }))
)
// А затем мы делаем mergeMap если понадобится:
if (shop.isNew) {
doSomething$ = doSomething$.pipe(
mergeMap(() =>
this.myApi.addTags(updatedShop.id, shop.tags).pipe(
map(() => {
return {
...updatedShop,
tags: shop.tags
};
})
)
)
)
}
// ну и затем подписываемся на это дело чтоб оно начало работать:
doSomething$.subscribe();
this.myApi.getSomething(id).pipe(
map(tags => ({ ...updatedShop, tags })),
mergeMap((tags) => {
if (!shop.isNew) {
return of(tags);
}
return this.myApi.addTags(updatedShop.id, shop.tags).pipe(
map(() => {
return {
...updatedShop,
tags: shop.tags
};
})
)
}),
)
constructor(props: Props) {
super(props);
}
<App props={} />
<app-graph [trainings]="trainings" *ngIf="trainings.length"></app-graph>