LINUX.ORG.RU

Undefined safety в TypeScript

 , ,


0

1

Котаны, начал переписывать кусок проекта на ТайпСкрипте, все хорошо - автодополнение, статические проверки.. но!
Undefined является bottom type, а следовательно, undefined может являться значением любого типа, со всеми катастрофическими последствиями (`TypeError: undefined is not an object` в рантайме).

Нельзя ли как-то научить конпелятор давать мне по рукам, если я разименовываю поля значения без предварительной проверки этого самого значения на undefined, как, например, это сделано в няшном Котлине?

inb4: хачкелль, монадки

Пока нашел вот это вот - https://github.com/cbowdon/TsMonad - можно использовать Maybe<T>, но, боюсь, посоны не поймут, если я буду туда-сюда в нее заворачивать и разворачивать значения прямо на рабочем месте.

anon1984
() автор топика

Такое можно сделать, только если в языке есть nullable/notnull типы, как раз как в котлине. Если их нет, то уже никто не поможет. Даже в том же котлине при вызове джава функции тип помечается восклицательным знаком(типа неясно что за тип). Но если не проверили явно на null, то даже компилятор котлина это игнорирует. Если же речь идёт о том, чтобы компилятор просто напоминал, что мы забыли проверить на null, то как он поймёт что мы уже проверили? Умного кастования типов от nullable в notnull нет же. В общем мне кажется в ts такое навернуть нельзя. Разве что оборачивать все в Option какой-нибудь как в скале.

blan4
()
Последнее исправление: blan4 (всего исправлений: 3)
Ответ на: комментарий от blan4

Но если не проверили явно на null, то даже компилятор котлина это игнорирует.

Нет. Там компилятор умеет это отслеживать:

var b: String? = "abc"
b = null // ok
print(b.length); // error: variable 'b' can be null

var b: String? = "abc"
b = null // ok
if (b != null) print(b.length); // ok

https://kotlinlang.org/docs/reference/null-safety.html

anon1984
() автор топика
Последнее исправление: anon1984 (всего исправлений: 1)

inb4: хачкелль, монадки

ghcjs же.

hateyoufeel ★★★★★
()
Ответ на: комментарий от anon1984

Я вероятно не совсем ясно выразился. Я имел в виду platform types для которых выключается проверка на null. Подробнее тут https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platf...

Самое смешное, что вы даже можете скастовать этот тип в notnull(например, в аргументах функции, переопределяющей джава функцию - часто в андроиде), но будете сильно удивлены в рантайме.

blan4
()
Ответ на: комментарий от blan4

А, понял. Я про interaction с джавой в котлине совсем ничего не знаю.

anon1984
() автор топика

Пока делал бутерброд, придумал такой костылик:

type Optional<T> = T|void;

function notNothing<T>(v: any): v is T {
    return (v !== undefined);
}

let nullableString: Optional<String> = 'fufufu';

if (notNothing<String>(nullableString)) 
	console.log(nullableString.length); //ok

console.log(nullableString.length); //error, property length does not exist on type String|void

anon1984
() автор топика
Последнее исправление: anon1984 (всего исправлений: 1)
7 марта 2016 г.
Ответ на: Жди от anonymous

Годнота какая. Если примут, и починят spread operator для литералов объектов, TS для меня будет очень близок к идеалу. Свои проекты я пилю на ScalaJS (неимоверно круто длительное время писать код в IDE, и быть уверенным, что после компиляции все скорее всего заработает как надо с первого раза), но у меня не хватит наглости пропихивать даже на единоличные фриланс-шабашки по причине маргинальности :)

anon1984
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.