Как я могу заставить TypeScript выдавать ошибку в этом коде? - PullRequest
0 голосов
/ 06 мая 2018

Обычно в TypeScript я определяю довольно сложные типы, поэтому у меня никогда не возникает этой проблемы, но я не могу найти простой способ ее решения.

type first = number;
type second = number;

let f: first = 1;
let s: second = 2;

const func = (arg1: first, arg2: second) => { };

func(s, f);

Я ожидаю получить ошибку из этого кода, потому что я определяю функцию с первым аргументом типа "first" и вторым аргументом типа "second", но когда я вызываю ее, я передаю два аргумента инвертированных типов

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

В настоящее время машинопись не поддерживает номинальный набор . В качестве обходного пути люди используют маркировку типа / брендинг:

type First = number & { readonly _tag: unique symbol };
type Second = number & { readonly _tag: unique symbol };

let f = 1 as First;
let s = 2 as Second;

const func = (arg1: First, arg2: Second) => { };
func(s, f);  // Error: Types of property '_tag' are incompatible.
0 голосов
/ 06 мая 2018

TypeScript не заботится об именах типов (или псевдонимах), а только о форме типа. Оба типа first и second одинаковы для компилятора, но вы не получите ошибку.

Фактически, из-за Структурной типизации этот код также будет работать:

interface I1 {
  name: string;
  age: number;
}

interface I2 {
  age: number;
  name: string;
}

var a1: I1;
var a2: I2;

function log(arg1: I1, arg2: I2): void {
  console.log(arg1, arg2);
}

log(a2, a1);

потому что I1 и I2 также являются псевдонимами одного и того же типа (оба интерфейса имеют одинаковые свойства с одинаковыми типами)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...