class Base<T> {
protected val: T;
}
class A extends Base<string> {
methodA(): string {
return this.val; // Ok, так как здесь val имеет тип string
}
}
class B extends Base<number> {
methodB(): number {
return this.val; // тоже ok, так как здесь val имеет тип number
}
}
type Keplr = {
enable(chainId: ChainId): Enable;
};
const isInstalled = (v: unknown): v is Keplr => !!(window.getOfflineSigner && v)
const enable = () => {
if (isInstalled(window.keplr)) return window.keplr.enable(chainId)
}
class Name1 {
method1() {
console.log(1);
}
}
class Name2 {
constructor(name1) {
this.name1 = name1;
}
method2() {
this.name1.method1();
}
}
const name2 = new Name2(new Name1());
name2.method2()
type Char = "A" | "B" | "C" | "D";
type ConcatMap<T> = T extends unknown
? {} extends T[keyof T]
? `${string & keyof T}`
: `${string & keyof T}${ConcatMap<T[keyof T]>}`
: never;
type MapChars<C extends Char> = {
[K in C]: MapChars<Exclude<C, K>>
};
type Split<S extends string> = S extends `${infer H}${infer Tail}`
? [H, ...Split<Tail>]
: [];
type T1 = Split<T2>;
type T2 = ConcatMap<MapChars<Char>>;
type Split<S extends string, D extends string = ''> = S extends ''
? []
: S extends `${infer H0}${D}${infer H1}${D}${infer H2}${D}${infer H3}${D}${infer H4}${D}${infer H5}${D}${infer Tail}`
? [H0, H1, H2, H3, H4, H5, ...Split<Tail, D>]
: S extends `${infer H0}${D}${infer H1}${D}${infer H2}${D}${infer H3}${D}${infer Tail}`
? [H0, H1, H2, H3, ...Split<Tail, D>]
: S extends `${infer H0}${D}${infer Tail}`
? [H0, ...Split<Tail, D>]
: never;
@Controller()
@Get('/dashboard')
@Render ('dashboard')
async getDashboard () {
const sites = await this.usersSitesService.selectSitesByUserId(1);
return { sites };
}
Какой смысл в тайпскрипте, если писатьselectSitesByUserId = async (id: number): Promise<any>
any
?Репо с докой router-controller https://github-com.translate.goog/typestack/routin...Ссылка на машинный перевод? Вы это серьезно?
Либо я чего-то не понимаюНе понимаете значение слова асинхронный
console.log
отрабатывает раньше любого errorsOnLines.push
Как написать это с помощью промисов и async/await, я знаю. А как написать это без промисов, с обычным коллбэком? До изобретения промисов как-то ведь писали такое...у api тоже может быть колбэк, который можно вызвать когда будет готов результат операции
const api = (cb) => {
fs.readFile(fileName, (err, content) => {
if (err) {
cb("none")
} else {
cb(content)
}
})
// return не нужен
}
Подскажите пожалуйста, стоит ли явно определять тип переменной или нет?В большинстве случаев нет, лучше доверится выводу типов, он сделает это лучше.
есть, так как ts знает, что const нельзя переприсвоить, а числа неизменяемый тип, он выведет тут литеральный тип 10, который без проблем можно передать как в number так и в union из литеральных типов содержащий в себе 10const a: number = 10;
Есть ли вообще какие то отличия?
// где-то есть
type SomeObject = { /* ... */ };
function getSomeObject(): SomeObject { /* ... */ }
// без явной декларации будет выведен тип null
let v: SomeObject | null = null;
setTimeout(() => {
// без явной декларации типа для v здесь будет ошибка
v = getSomeObject();
});
n % 10
const lastDigit = n => {
// в n совсем не то
if (isNaN(n) || !isFinite(n)) return NaN;
// в n целое
if (n % 1 === 0) return n % 10;
// для дробных проще со строкой работать
const s = String(Math.abs(n));
// неточные значения
if (s.length > 16 || s.includes('e')) return NaN;
return +s.slice(-1);
}