這與物件無關{} === {},
發現這個問題不知道是不是一樣
型別集 -AUnion不是空集。另外兩種型別 (L和R) 正在擴展它。我的理解是這些 L、R 至少與 AUnion 一樣寬,因此我希望 L 和 R 中的元素沒有空的交集 - 即 AUnion。
我缺少 TypeScript 型別系統的哪一部分?
給定 TypeScript 代碼
type AUnion = 'a'|'b';
type Proc = <L extends AUnion, R extends AUnion>(l:L, r:R)=>0|1;
declare const proc:Proc;
可以使用兩個相等的引數呼叫 proc
const arg:'a' = 'a';
proc(arg,arg); // this is fine (type-wise) 'a' does extend AUnion
據我了解'a'等于'a'。它們的型別是一個a和一個擴展聯合型別AUnion。
讓我們實作型別。
const proc:Proc = (l, r)=>{
if(l===r){
return 0;
}
return 1;
}
然而打字稿抱怨
This condition will always return 'false' since the types 'L' and 'R' have no overlap.
游樂場鏈接
我錯過了什么?
uj5u.com熱心網友回復:
根據各種 GitHub 問題,存在錯誤是有意的,但錯誤的確切措辭并不總是合適的。請參閱microsoft/TypeScript#25642、microsoft/TypeScript#27910、microsoft/TypeScript#41402。
如果你有一個價值x型X和價值y型的Y,那么無論是規則x === y允許的是,X和Y必須是“可比的”。粗略地說,這意味著要么X extends Y或Y extends X已知是真實的。如果這些都不知道是真的,那么x === y將被禁止。
對于某些第三種型別,兩者X extends Z和Y extends Z可能都被認為是正確的事實Z并沒有改變這一點。事實上,該unknown型別是頂級型的打字稿,這意味著X extends unknown和Y extends unknown將是每一個真正的X和Y。因此,XandY被限制為一些常見的超型別這一事實實際上并不意味著XandY適合相互比較。
在您的情況下,L extends AUnionand R extends AUnion,但都不知道L extends R也不R extends L知道是真的。所以編譯器不允許比較。
至于具體的錯誤資訊措辭,那就不好了。這是不正確可證明是x === y“總是回傳false”時X,并Y沒有“可比性”。當編譯器說“X并且Y沒有重疊”時,聽起來肯定是在說“X & Y是never”,但當然這不一定是真的。有些情況總是會回傳false(例如,如果X是string和Y是number,或者如果X是{z: string}和Y是{z: number})。
但X & Y真正的空虛不是問題。編譯器將阻止比較{x: string}and{y: number}即使交集 ,{x: string; y: number}絕對不是空的。因此,并沒有真正阻止比較,因為這兩個值不可能相同;它被阻止是因為比較兩個不直接相關的型別通常表示錯誤。
如果要比較編譯器認為其型別“不可比較”的兩個值,您始終可以將它們中的一個或兩個擴展為可比較的型別。在您的情況下,您知道兩者L和R都可以比較AUnion,因此您可以執行類似的操作
const proc: Proc = (l, r) => {
const _l: AUnion = l;
const _r: AUnion = r;
if (_l === _r) { // okay
return 0;
}
return 1;
}
或者
const proc: Proc = (l, r) => {
if (l as AUnion === r) { // okay
return 0;
}
return 1;
}
Playground 代碼鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/407281.html
標籤:
上一篇:旋轉時剪切網格
