Валерий Кузьмин, СКБ Контур
Perm Tech Talks, 2017
Kontur.Recognition
Проблема - надо писать 2 раза
Подходы
JS
JS
C#
C#
JS
node.js
edge.js
codegen
Open-source решения
private static ValidateInn(inn: string): List<ValidationResult>
{
var list: List<ValidationResult> = new List<ValidationResult>();
var flag: boolean = InnKppHelper.IsInnForIndividual(inn);
var flag2: boolean = InnKppHelper.IsInnForLegalEntity(inn);
if (flag || flag2)
{
if (!InnKppHelper.IsInnChecksumValid(inn))
{
var arg_5D_0: List<ValidationResult> = list;
var validationResult: ValidationResult = new ValidationResult();
validationResult.Message = "Неверная контрольная сумма ИНН";
arg_5D_0.Add(validationResult);
}
}
....
}
На выходе
Как это работает
Krec.Isomorphic.dll
Как это работает
CsToTs
TsOutputVisitor
Как это работает
Готовая сборка
Архитектура
C#
DLL
TypeScript
JS
PROFIT!
NetJS
webpack
msbuild
???
Архитектура
C#
DLL
TypeScript
Fixed TS
JS
PROFIT!
NetJS
webpack
gulp
msbuild
???
2
1
(1) webpack: референсы
///<reference path='mscorlib.ts'/>
... my ts code ...
import {
NObject,
Exception,
NBoolean,
...
} from './mscorlib.ts';
(1) webpack: экспорты
class DocumentExtensions extends NObject ...
export class DocumentExtensions
extends NObject ...
+ enum, interface
(2) netjs: mscorlib.ts
class NString {
...
static TrimEnd(str: string, trimChars: number[]): string
{
throw new NotImplementedException();
}
...
}
(2) netjs: ES3
class Person {
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
class Person extends NObject {
name: string;
SetName(value: string): void
{
this.name = value;
}
GetName(): string
{
return this.name;
}
}
tsc.exe -t ES3 mscorlib.es3.ts Library.ts --out Library.js
В итоге:
Бонус: схема
{
documents: [{...},{...}]
}
{
documents: List<Document>
}
Runtime
Вопросы?
malcoriel@gmail.com
malcoriel