declare const a: {a: 1, b: 2} | {a: 1};
if ('b' in a) { // ts тут сужает тип до {a: 1, b: 2}
console.log(a.b);
}
$.ajax({
url: "/handlers/barcode.php",
type: "get",
xhrFields: { responseType: 'blob'},
converters: {'* image': true},
data: {
data: 'ABC-abc-1239',
code: 'Code128',
},
success: function(response) {
$('#barcode').html('<img src="' + URL.createObjectURL(response) + '"/>');
},
error: function(xhr) {
console.log('Ошибка запроса')
}
});
fetch('/handlers/barcode.php?data=ABC-abc-1239&code=Code128')
.then(res => res.blob())
.then(URL.createObjectURL)
.then(src => {
$('#barcode > img').attr('src', src)
})
.catch(err => {
console.log('Ошибка запроса')
});
unknown
, и работа с ним исходя из этого, со всеми требуемыми проверками перед какими-либо действиями. UserInfo
обратно совместим с BaseUserInfo
, т.к. для BaseUserInfo.getState()
возвращаемое значение имеет тип void
(не путать с undefined
), который никак не может быть использован (сам ts не даст).abstract class BaseUserInfo {
abstract getState(): void;
}
class UserInfo extends BaseUserInfo {
override getState = (): number => 1;
}
function useInfo(info: BaseUserInfo) {
// An expression of type 'void' cannot be tested for truthiness.(1345)
if (info.getState()) { // не получится так сделать и всё сломать
console.log('never')
}
}
function getCommand(file) {
return import(
/* webpackInclude: /[A-Za-z0-9-_,\s]+\.ts$/i */
`./commands/${file}`
);
}
// какая-то проверка достаточная чтобы сказать, что у нас тут NextPageContext;
const isNextPageContext = (ctx: unknown): ctx is NextPageContext => false;
// аналогично для AppContext
const isAppContext = (ctx: unknown): ctx is AppContext => false;
const baseQuery = fetchBaseQuery({
baseUrl: 'http://localhost:7777/api/auth',
prepareHeaders: (headers, { extra }) => {
let req;
if (isNextPageContext(extra)) {
req = extra.req;
} else if (isAppContext(extra)) {
req = extra.ctx?.req;
}
if (req) {
headers.set('Cookie', req.headers.cookie || '');
}
return headers;
},
credentials: 'include',
});
interface CreateConnectionOptions extends ConnectOptions {
retryCount?: number;
retryDelay?: number;
}
function createConnection(uri: string, {
retryCount = 6,
retryDelay = 1000,
...mongooseConnectOptions
}: CreateConnectionOptions = {}): Observable<Connection> {
let connection$ = defer(() => mongoose.createConnection(uri, mongooseConnectOptions).asPromise());
if (retryCount > 0) {
connection$ = connection$.pipe(retry({
count: retryCount,
delay: retryDelay
}));
}
return connection$.pipe(shareReplay(1));
}
receivedData
может быть фиксированное количество записей фиксированных размеров, то условно как-то так:<div v-if="loading">
<div v-for="foo in 10" class="fixed-size loading"></div>
Loading
</div>
<div v-else>
<div v-for="foo in receivedData.foo" class="fixed-size">{{ foo }}</div>
{{ receivedData.bar }}
</div>
const obj = { ... };
type Obj = typeof obj;
const products = {
value: false
};
console.log(products)
console.log(products.value)
products.value = true;
ref
в данном случае никакой.ref.value
ты уже получил текущее значение, если оно изменилось позже, то ты об этом никак не узнаешь, не поучив снова ref.value
. Собсно потому и нужно это уродское .value
, т.к. в js (пока?) нет нативных ref-ссылок приходится везде тащить объект-обёртку. <compnent-group-name>.variables.scss
и импортируете его куда надо. props
. Каждый отдельный компонент - чёрный ящик. У тебя должна быть возможность полностью и кардинально изменить вёрстку внутри компонента, не изменив его поведение. В vue 3 для этого даже есть удобная конструкция v-bind
внутри <style>
.$gap
глобальный параметр, можно в конфиге vue\sass-loader добавить общий для всех файл с переменными.