Как преодолеть действительный тест assert значения, измененного функцией, в машинописном тексте? - PullRequest
1 голос
/ 27 мая 2020

Вот мой машинописный код, который я использую в значении.

import { assert } from "https://deno.land/std/testing/asserts.ts"

interface Tree{
    size:number
}

let tree: Tree= {
    size: 1
}

let f1 = (tree: Tree)=>{
    tree.size--
}

function main(){
    assert(tree.size === 1)
    f1(tree);
    assert(tree.size === 0);
}

Когда я запускаю его, он выдает мне эту ошибку при компиляции в строке 20:

error: TS2367 [ERROR]: This condition will always return 'false' since the types '1' and '0' have no overlap.
    assert(tree.size === 0);

Это являются действительными утверждениями, но по-прежнему жалуются на это как IDE, так и компилятор Typescript. Как решить эту проблему?

1 Ответ

2 голосов
/ 27 мая 2020

Глядя на то, как assert функция реализована , вы можете увидеть, что она использует подпись утверждения .

Проблема в том, что

asserts гарантирует, что любое проверяемое условие должно быть истинным для оставшейся части содержащей его области .

В настоящее время Typescript не может узнать, что f1 изменяет / мутирует tree. Вы можете прочитать о компромиссах при анализе потока управления здесь


В качестве временного решения вы можете предотвратить вывод буквального типа в машинописном тексте для 1:

assert(tree.size === 1 as number);

Детская площадка

...