
LiberateAI
25.08.2017
16:37:02
"q".repeat(Number.MAX_SAFE_INTEGER);
В лисе не работает, ссылается на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Resulting_string_too_large
Да и в хроме тоже)

Дмитрий
25.08.2017
18:14:58

Павел
26.08.2017
11:12:44
Друзья, подскажите, что я делаю не так?
Есть функция foo, которая вызывает processBar, передавая свой аргумент ей. Функцию foo я вызываю, передавая ей тип Bar. При этом компилятор подсвечивает ошибку о несовпадении параметров при вызове processBar.
Пример, о котором идет речь, тут:
https://www.typescriptlang.org/play/#src=const%20myBar%3A%20Bar%20%3D%20%7B%20zoo%3A%20true%7D%3B%0D%0Afoo%3CBar%3E(myBar)%3B%0D%0A%0D%0Ainterface%20Bar%20%7B%0D%0A%20%20%20%20zoo%3A%20boolean%3B%0D%0A%7D%0D%0A%0D%0Afunction%20foo%3CT%3E(f%3A%20T)%3A%20void%20%7B%0D%0A%20%20%20%20processBar(f)%3B%0D%0A%7D%0D%0A%0D%0Afunction%20processBar(bar%3A%20Bar)%3A%20void%20%7B%0D%0A%20%20%20%20console.log(bar)%3B%0D%0A%7D%0D%0A

Andrey
26.08.2017
11:16:37

Google

Andrey
26.08.2017
11:17:03
T может быть любым, а proccessBar принимает только определенный

Aleh
26.08.2017
11:17:08
f(1) тоже валидно
но очевидно 1 не Bar

Павел
26.08.2017
11:20:11
Да, это понятно, что типы не совпадают, в этом и проблема, решение которой, я подозреваю, в приведении аргумента f к требуемому типу Bar. Вопрос, собственно, в том, как это сделать?

Aleh
26.08.2017
11:20:44
https://www.typescriptlang.org/play/#src=const%20myBar%3A%20Bar%20%3D%20%7B%20zoo%3A%20true%7D%3B%0D%0Afoo(myBar)%3B%0D%0A%0D%0Ainterface%20Bar%20%7B%0D%0A%20%20%20%20zoo%3A%20boolean%3B%0D%0A%7D%0D%0A%0D%0Afunction%20foo(f%3A%20Bar)%3A%20void%20%7B%0D%0A%20%20%20%20processBar(f)%3B%0D%0A%7D%0D%0A%0D%0Afunction%20processBar(bar%3A%20Bar)%3A%20void%20%7B%0D%0A%20%20%20%20console.log(bar)%3B%0D%0A%7D%0D%0A

Павел
26.08.2017
11:21:37

Aleh
26.08.2017
11:21:57
либо делайте проверки

Andrey
26.08.2017
11:22:18

Aleh
26.08.2017
11:22:41
опишите задачу, а то гадать не хочется

Павел
26.08.2017
11:22:51
Мой пример в песочнице — это упрощенный вариант корневого редьюсера и вложенных редьюсеров в redux, где action может быть разным, типизированным для каждого действия.

Andrey
26.08.2017
11:23:13
T extends Bar
https://www.typescriptlang.org/play/#src=const%20myBar%3A%20Bar%20%3D%20%7B%20zoo%3A%20true%7D%3B%0D%0Afoo%3CBar%3E(myBar)%3B%0D%0A%0D%0Ainterface%20Bar%20%7B%0D%0A%20%20%20%20zoo%3A%20boolean%3B%0D%0A%7D%0D%0A%0D%0Afunction%20foo%3CT%3E(f%3A%20T)%3A%20void%20%7B%0D%0A%20%20%20%20processBar(f)%3B%0D%0A%7D%0D%0A%0D%0Afunction%20processBar(bar%3A%20Bar)%3A%20void%20%7B%0D%0A%20%20%20%20console.log(bar)%3B%0D%0A%7D%0D%0A

Google

Andrey
26.08.2017
11:24:20
Вот так.

Aleh
26.08.2017
11:25:07
https://www.typescriptlang.org/play/#src=type%20Action1%20%3D%20%7B%0D%0A%20%20%20%20type%3A%20%22Action1%22%0D%0A%20%20%20%20field1%3A%20number%0D%0A%7D%0D%0A%0D%0Atype%20Action2%20%3D%20%7B%0D%0A%20%20%20%20type%3A%20%22Action2%22%0D%0A%20%20%20%20field2%3A%20string%0D%0A%7D%0D%0A%0D%0Atype%20Action%20%3D%20Action1%20%7C%20Action2%0D%0A%0D%0Atype%20State%20%3D%20%7B%7D%20%7C%20null%0D%0A%0D%0Afunction%20reducer(state%3A%20State%20%3D%20null%2C%20action%3A%20Action)%20%7B%0D%0A%20%20%20%20switch%20(action.type)%20%7B%0D%0A%20%20%20%20%20%20%20%20case%20%22Action1%22%3A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20action.field1.toFixed()%20%2F%2F%20number%0D%0A%20%20%20%20%20%20%20%20case%20%22Action2%22%3A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20action.field2.charAt%3B%20%2F%2F%20string%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20return%20state%0D%0A%7D

Павел
26.08.2017
11:26:20


Friedrich
27.08.2017
05:27:04
Господа, я что-то сегодня с утра вообще туплю на примитивном коде. Есть file1.ts:
export default class SomeClass1 {}
И есть file2.ts:
import * as Class1 from "./file1";
function foo(c: Class1): void { // Cannot find name "Class1"
let x = 2 + 2;
}
Что я делаю не так?
Разобрался. Нужно было import Class1 from "./file1". Я вообще не знал, что так можно %)

Andrew
27.08.2017
06:06:42
По-моему первый вариант тоже может работать, но там import * as nsp from "...", и потом везде юзаешь nsp.Class1

Friedrich
27.08.2017
07:28:06
В этом случае же ведь получается, что nsp это и есть SomeClass1.

Eugene
27.08.2017
08:05:39
Хз, сюда или нет вопрос.
Но юзаю я такой например React с Typescript, и тут у меня функция handleSubmit(e) которая обрабатывает onSubmit, какой тип у e ?

Friedrich
27.08.2017
08:09:01

Eugene
27.08.2017
08:15:00

Andrew
27.08.2017
10:16:38

Friedrich
27.08.2017
10:18:26
Ну на то там и export default, что ты хочешь что-то основное экспортить без неймспейса, так ведь?
Хотя я, похоже, вообще не умею в export default, и поэтому путаюсь. Тот вопрос, который я задавал утром, вообще не должен был бы возникнуть, если б я прочитал документацию по модулям :)

Aleh
27.08.2017
10:22:33
nsp.default

Friedrich
28.08.2017
04:22:38
Обнаружил превосходную фичу:
class FooBar {
v = 100500;
foo(this: FooBar) {
return this.v;
}
}
const foo = new FooBar().foo;
foo(); // ошибка, если включена опция --noImplicitThis
Я действительно хочу, чтобы в этом случае компилятор указывал на ошибку. Однако, меня парит каждый раз во всех нестатических методах класса писать this: ClassName. Почему это не делается по умолчанию?

Ivan
28.08.2017
13:12:22
@fvnever зайди в checker.ts, посмотри :)
удачи с этим

Friedrich
28.08.2017
13:13:08
Не могу открыть, там не видно ничего! ?
Вообще, был уже один экспериментатор, который пытался включить эту фичу по умолчанию. Его PR даже смержили, а потом спешно откатили, потому что резко начал проседать перфоманс. Видимо, просто не вполне удачной была реализация.

Google

Aleh
28.08.2017
13:14:06

Friedrich
28.08.2017
13:14:15
Щас найду, минутку.
а можно линк?
Вот изначальный PR с фичей:
- https://github.com/Microsoft/TypeScript/issues/6018
Вот тут его откатили (частично; неоткаченную часть мы сегодня знаем как --noImplicitThis):
- https://github.com/Microsoft/TypeScript/issues/7689
А вот чуваки просят добавить фичу обратно:
- https://github.com/Microsoft/TypeScript/issues/7968

andretshurotshka?❄️кде
28.08.2017
18:35:35
type A = { a: 'b', c: 'd' }
type B = Swap<A> // { b: 'a', d: 'c' }
как такое сделать с mapped types?

Сергей
28.08.2017
18:36:06
Покажи исходник Swap

andretshurotshka?❄️кде
28.08.2017
18:36:18
так я спрашиваю как написать Swap)

Сергей
28.08.2017
18:36:23
А

Aleh
28.08.2017
18:37:05
нельзя менять ключ вроде

andretshurotshka?❄️кде
28.08.2017
19:03:43
хм

Eugene
28.08.2017
19:04:19
А если там не строка? Как ты ключом сделаешь его сделаешь?

andretshurotshka?❄️кде
28.08.2017
19:04:59
там строка всегда
походу реально никак

andretshurotshka?❄️кде
28.08.2017
19:06:36
https://github.com/tycho01/typical/issues/4 лол
чувак запилил)
export type Obj<T> = { [k: string]: T };
export type UnionHasKey<Union extends string, K extends string> = ({[S in Union]: '1' } & Obj<'0'>)[K];
export type If<Cond extends '0'|'1', Then, Else> = { 1: Then, 0: Else }[Cond];
type A = { a: 'b', c: 'd' };
type Keys = keyof A; // "a" | "c"
type Vals = A[keyof A]; // "b" | "d"
type y = {[P1 in Vals]: {[P2 in keyof A]: If<UnionHasKey<A[P2], P1>, P2, never> }[Keys] }; // { b: "a"; d: "c"; }
type Swap<
T extends { [k: string]: string },
Keys extends keyof T = keyof T,
Vals extends string = T[Keys]
> = {[P1 in Vals]: {[P2 in Keys]: If<UnionHasKey<T[P2], P1>, P2, never> }[Keys]};
type B = Swap<A>;

Admin
ERROR: S client not available

andretshurotshka?❄️кде
28.08.2017
19:28:55
зацените

Aleh
28.08.2017
19:29:22
а, ну красиво да

andretshurotshka?❄️кде
28.08.2017
19:29:40

Google

andretshurotshka?❄️кде
28.08.2017
19:29:43
export type Obj<T> = { [k: string]: T };
export type UnionHasKey<Union extends string, K extends string> = ({[S in Union]: '1' } & Obj<'0'>)[K];
export type If<Cond extends '0'|'1', Then, Else> = { 1: Then, 0: Else }[Cond];
type A = { a: 'b', c: 'd' };
type Keys = keyof A; // "a" | "c"
type Vals = A[keyof A]; // "b" | "d"
type y = {[P1 in Vals]: {[P2 in keyof A]: If<UnionHasKey<A[P2], P1>, P2, never> }[Keys] }; // { b: "a"; d: "c"; }
type Swap<
T extends { [k: string]: string },
Keys extends keyof T = keyof T,
Vals extends string = T[Keys]
> = {[P1 in Vals]: {[P2 in Keys]: If<UnionHasKey<T[P2], P1>, P2, never> }[Keys]};
type B = Swap<A>;
вот рабочий
как это работает вообще

Aleh
28.08.2017
19:30:15

Дмитрий
29.08.2017
09:20:41
type A = 'a' | 'b'
type TB = {
[P in A]: string
}
interface IB {
[P in A]: string
}
Я, наверное, что-то совсем глупое делаю, но почему в типе это работает, а в интерфейсе нет?
И как, собственно, добиться нужного результата при использовании интерфейса?

dima
29.08.2017
09:34:34
не по теме. Знаком кто с sequelize ?

Ivan
29.08.2017
09:38:48
я знакм

Aleh
29.08.2017
09:39:53
юзай типы, в чем проблема?

Denis
29.08.2017
09:52:04
https://github.com/guidojo/multipleTypescriptCompilers

dima
29.08.2017
10:34:39

Дмитрий
29.08.2017
10:46:19
юзай типы, в чем проблема?
это функция, внутри которой есть еще несколько методов, типа
interface Log {
(data: string): void
debug (data: string): void
…
}

Aleh
29.08.2017
10:46:43
type Log = {
(data: string): void
debug(data: string): void
}
и т.д.

Дмитрий
29.08.2017
10:47:09
я не хочу вручную писать все эти debug, fatal и прочие
export type ITerminalLoggerLevels = 'debug' | 'info' | 'warn' | 'error' | 'fatal'
Сейчас сделал так:
type Logger = (data: string) => void
type ITerminalLogger = Logger & {
[P in ITerminalLoggerLevels]: Logger
}

andretshurotshka?❄️кде
29.08.2017
16:50:07
?

sne18
29.08.2017
17:34:26
Народ, в какой группе найти TypeScript разработчика ?

Mikhail
29.08.2017
17:37:24

Google

Artem
29.08.2017
17:45:41