Защита типа для условного типа параметра - PullRequest
0 голосов
/ 28 мая 2020

Почему этот код не работает?

Typescript может легко догадаться, что переменная типа (T extends '1' ? '1' : never) никогда не будет false, поэтому NonFalse<TypeWithCondition<T>> в точности совпадает с true | (T extends '1' ? '1' : never).

Это ошибка машинописного текста? Должен ли он быть размещен как запрос функции?

type TypeWithCondition<T> = boolean | (T extends '1' ? '1' : never);

type NonFalse<T> = Exclude<T, false>;

const logNonFalse = <T>(b: NonFalse<TypeWithCondition<T>>) => {
    console.log(b);
};

const test1 = <T>(a: TypeWithCondition<T>) => {
    if (a === false) throw new Error("Can't be false");
    logNonFalse(a);
    // Error : Argument of type 'true | ([T] extends ["1"] ? "1" : never)' is not assignable to parameter of type 'true'.
    //  Type '[T] extends ["1"] ? "1" : never' is not assignable to type 'true'.
    //    Type '"1"' is not assignable to type 'true'.(2345)
};

1 Ответ

0 голосов
/ 03 июня 2020

Машинопись пока не справляется с этим. Cf https://github.com/microsoft/TypeScript/issues/38863

...