Typescript strict alias checking

Is there a way to force typescript to perform even more stringent type checking before checking for an alias?

What I want to achieve is to define types, for example:

type kilograms = number;
type kilometers = number;
type kilogramsPerKilometer = number;

And to be sure that I do not put the incorrectly entered value in a variable, for example:

let x: kilograms = 123;
let y: kilometers = 256;
let z: kilogramsPerKilometer = x / y; // Will popup an error here saying that types are incompatible

In this case, this requires an explicit cast type:

let x: kilograms = 123;
let y: kilometers = 256;
let z: kilogramsPerKilometer = <number>x / <number>y; // Will downcast `kilograms` and `kilometers` types to `number` and then up-cast types to `kilogramsPerKilometer`
+4
source share
3 answers

There is no nominal typing in TS (yet) https://github.com/Microsoft/TypeScript/issues/202

This is a valid solution (using discriminatory associations):

interface kilograms {
  kind: "kilograms";
  value: number;
}

interface kilometers {
  kind: "kilometers";
  value: number;
}

function kilosPerKiloms(x: kilograms, y: kilometers): kilogramsPerKilometer {
  return x.value / y.value;
}

const x = { kind: "kilograms", value: 123 };
const y = { kind: "kilometers", value: 256 };
const z = kilosPerKiloms(x, y);
// const z = kilosPerKiloms(y, x); // => error

Additional Information:

https://www.typescriptlang.org/docs/handbook/advanced-types.html

https://basarat.gitbooks.io/typescript/content/docs/types/discriminated-unions.html

+1

:

type kilograms = number;
type kilometers = number;
type kilogramsPerKilometer = number;

function kilosPerKiloms(x: kilograms, y: kilometers): kilogramsPerKilometer {
  return x / y;
}

let x: kilograms = 123;
let y: kilometers = 256;
let z: kilogramsPerKilometer = kilosPerKiloms(x, y);
0

You are looking for nominal typing. Support for future versions of TypeScript is planned (see Roadmap ). For now, you should use this: https://basarat.gitbooks.io/typescript/docs/tips/nominalTyping.html

0
source

Source: https://habr.com/ru/post/1667473/


All Articles