export type TBookPage = Omit<TBookBasic, 'authors'> & {
// [...]
authors: TCategoryAuthorBook[]
}
function preparedData<T extends Record<string, {name: string, id: string}[]>>(data: T) {
return Object.keys(data).map((key) => {
return data[key as keyof T].map((a) => ({
val: a.name,
newId: a.id,
}));
});
}
class Delegate<Target, Args extends any[], Ret> {
constructor(
private target: Target,
private method: (this: Target, ...args: Args) => Ret,
) {}
public invoke(...args: Args): Ret {
return this.method.apply(this.target, args);
}
}
Вот только конструировать такой делегат в отличии от шарпа придется явно.Argument of type 'ComputedRef' is not assignable to parameter of type 'string'.
Аргумент типа 'ComputedRef' не может быть присвоен параметру типа 'string'.
const pErrorMinMessage = computed<string>(() => {
return 'world'
})
const fun1 = function (val: string) {
console.log('hello' + val)
}
fun1(pErrorMinMessage.value)
type AlbumType = {
id: number;
title: string;
};
enum ActionPoints {
SET_ALBUMS = "SET_ALBUMS",
ADD_ALBUM = "ADD_ALBUM",
REMOVE_ALBUM = "REMOVE_ALBUM"
}
type ActionType = {
type: ActionPoints.SET_ALBUMS;
payload: AlbumType[];
} | {
type: ActionPoints.ADD_ALBUM;
payload: AlbumType;
} | {
type: ActionPoints.REMOVE_ALBUM;
payload: number;
};
const reducer = (state: AlbumType[], action: ActionType) => {
switch (action.type) {
case ActionPoints.SET_ALBUMS:
return action.payload;
case ActionPoints.ADD_ALBUM:
return [...state, action.payload];
case ActionPoints.REMOVE_ALBUM:
return state.filter((album) => album.id !== action.payload);
default:
return state;
}
};
declare const JSON: {
id: number;
}[];
export default JSON;
number | string | symbol
type MyFunc = <N extends string>() => (N extends string ? Field<N> : never)[];
но возвращаемый тип так же будет юнионом:({ name: "town" } | { name: "city" })[]
"town" | "city"
это тоже самое, что и тип "city" | "town"
.type MyFunc = <N extends string[]>() => {
[K in keyof N]: N[K] extends string ? Field<N[K]> : never;
};
myFunc<["town", "city"]>()
as const
, что так же делает его readonly массивом. Но принимать аргументы через readonly там где нам не нужно их мутирорвать - это вообще хорошая практика. Полный пример будет выглядеть так:Можете, пожалуйста, объяснить, что выполняет эта часть кода: (Membership || (Membership = {})Если в Membership не falsy значение (например объект), то передать ссылку на него в функцию, иначе (если в Membership undefined) присвоить в Membership новый объект и передать ссылку на него в функцию
И почему это всё обёрнуто в функцию?Сложно сказать, думаю кто-то скопировал код отсюда в код сюда и не стал париться, так как в обоих случаях есть declaration merging, о котором уже написал Aetae
useState<User[] | null>(null);
Здесь Вы пишите, что в стейте у Вас либо null либо массив юзеров.а здесь Вы уговорили TS что ответ - это 1 юзер и пытаетесь передать его в стейт.const _user = (await response.json()) as User; setItem(_user);
а вот здесь у Вас компонент так же принимает только одного юзера, но передаете Вы емуinterface IUserInfoProps { user: User; }
<UserInfo user={item} />
значение из стейта с типом User[] | null
Generic type 'Constructor2' requires 1 type argument(s).
function Activatable<TBase extends Constructor2>
function Activatable<T, TBase extends Constructor2<T>>
хотя это сильно зависит от задачи...Type 'TBase' is not a constructor function type.эта ошибка вылезла из предыдущей
Cannot create an instance of an abstract class.
Cannot assign an abstract constructor type to a non-abstract constructor typeвсе правильно ругается, абстрактные классы на то и абстрактные, что в них есть абстрактные методы, у которых реализация должна быть в наследнике, их конструирование приведет к ошибкам и TS от этого защищает.
A mixin class that extends from a type variable containing an abstract construct signature must also be declared 'abstract'.Миксин принимает на вход произвольный абстрактный класс, не зная о всех его абстрактных методах, поэтому он тоже должен быть абстрактным.
Вот этот тип некорректен...type AbstractConstructor<T> = Function & { prototype: T };
string[] | Record<string, any>[]
- это или массив строк или массив объектов (ключ - любая строка, значение любого типа). Данный тип не позволит смешивать строки и объекты в одном массиве, либо то либо другое.(string | Record<string, any>)[]
(массив из строк или объектов в перемешку).