为什么打字稿用递归类型推断未知?

时间:2021-04-18 09:18:47

标签: typescript

为什么 document.getElementById("buttondown").onclick = function() { window.scrollTo({ top: 100, left: 100, behavior: 'smooth' }); } U 中被推断为 unknown

难道它不看看 foo 就知道 UnwrappedArray 必须是 U 还是另一个 string

有什么提示可以给编译器以帮助它吗?

UnwrappedArray
type Unwrap<T> = T extends string ? T : T extends Array<infer U> ? UnwrappedArray<U> : never;
interface UnwrappedArray<T> extends Array<Unwrap<T>> {}

let a: string = "hello";
let b: Unwrap<string> = a;
a = b;

let c: Array<string> = [a];
let d: Unwrap<Array<string>> = c;
c = d;

function foo<A>(unwrapped: Unwrap<A>): A {
    // This fails.
    return unwrapped;
}

Playground

1 个答案:

答案 0 :(得分:1)

我举个反例,我们想想当A['1']类型的时候,所以当我们用type Unwrap<A>来变换它的时候,由于interface UnwrappedArray<T> extends Array<Unwrap<T>> {},最后,{ {1}} 将等于 UnwrappedArray<U>,它不是初始类型 Array<'1'>。这证明了:

['1']

要解决此问题,您可以尝试以下更改:

let e: Array<"hello"> = ["hello"];
let f: Unwrap<Array<string>> = e;
// Counter example.
e = f;

Playground