что-то-такое
class Thing {}
class Foo extends Thing {
public readonly f: number;
public constructor() {
super();
this.f = 10;
}
}
class Bar extends Thing {
public readonly b: string;
public constructor() {
super();
this.b = "nope";
}
}
type ThingName = "foo" | "bar"
const things = new Map<ThingName, typeof Thing>([
["foo", Foo],
["bar", Bar],
]);
const ctor = things.get("foo")!;
const t = new ctor();
Уверен, что менять type на module в данном случае абсолютно не обязательно и должен быть какой-то простой осуществить задуманное.
Instead change the require of vite.config.base.js
nodejs, который, в свою очередь, ничего знать не знает про ESM синтаксис
Проблема, полагаю. на уровне vite
vite.config.ts
. type TUnion = "foo"|"bar"|"qux"
function fn(value: "foo"): boolean;
function fn(value: "bar"): string;
function fn(value: "qux"): number;
function fn(value: TUnion): string | boolean | number {
switch(value){
case "bar": return '';
case "foo": return true;
case "qux": return 1;
default: throw Error('invalid value')
}
}
let f = fn("foo"); // f: boolean
let b = fn("bar"); // b: string
let q = fn("qux"); // q: number
user.model.ts
) в формат модуля CommonJS, то в JS-выхлопе после компиляции будут вызовы require. Судя по чейнджлогу для версии 4.0 Ситник выпилил нафиг поддержку CommonJS в 4-й версии, однако она остаётся в версии 3 и будет некоторое время поддерживаться. Вы не можете взять и из CommonJS-модуля сделать require ES-модуля (а в пакете версии 4 только ES-модули и остались).module
в tsconfig.json на es2015/es2020/es2022. Это самый предподчтительный вариант, но все остальные ваши инструменты и библиотеки должны быть готовы работать с ES-модулямиnewText = newText.substring(1);
, чтобы что? Почему не завести отдельную переменную tailText
или перенести это во второе выражение?text[0]
, а хвост берём у newText
. Выглядит так, что это сделано специально, но не пойму почему. А если НЕ специально - то вот вам пример как вы усложнили код на ровном месте.const id = findIdByName("abc");
The stricter checking applies to all function types, except those originating in method or constructor declarations. Methods are excluded specifically to ensure generic classes and interfaces (such as Array) continue to mostly relate covariantly.
type AFnc = (p: A) => void
function foo(p: A): void { }
function bar(p: AB): void { }
const f: AFnc = foo;
const b: AFnc = bar; // не компилируется с сообщением о том, что AB требует ещё и свойство b
const arr1 : [Item, ...Item[]] = [{ title: 'a' }] // OK
const arr2 : [Item, ...Item[]] = [] // Не скомпилируется
./modules/export.js
require("./modules/scene")
import createScene from "./modules/scene";
объявленный объект должен всё ещё оставаться для ts вариантом типа Some, чтобы его можно было спокойно передавать в методы и функции ожидающие Some на вход.
interface Some {
value: string | string[];
}
const foo = {
value: ['a', 'b'] // здесь всегда будет массив
};
foo.value.map(() => { });
function f(a: Some) {
return a;
}
f(foo);
при объявлении объекта он должен быть проверен на соответствие типу Some(чтоб ide мне сразу подсветила если я где-то ошибся и предложила автокомплит).
interface Some {
value: string | string[];
}
// Тут вам стоит придумать более подходящее по смыслу название
interface WithArrayValue {
value: string[];
}
const foo: Some & WithArrayValue = {
value: ['a', 'b'] // здесь всегда будет массив
};
foo.value.map(() => { });
function f(a: Some) {
return a;
}
f(foo);
В самом Vault библиотека dayjs и тип Dayjs нигде не используются!
Конкретно не понимаю что значит знак &
Почему там typeof
typeof Model
здесь - это type query expression. Если непонятно почему тут можно использовать typeof, вот великолепное объяснение, а вот ссылка на спецификацию языка.И что за екзампляр создается тут new (values?: object, options?: BuildOptions)
new MyModelStatic(values, options)
, это construct signature. Обратите внимание как именно используется в моём примере объект MyModelStatic.