为什么 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;
}
答案 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;