簡體   English   中英

Typescript 部分接口異常行為

[英]Typescript Partial interface odd behavior

我在正在處理的存儲庫中遇到了一些看起來完全錯誤的代碼。 下面是我遇到的一個例子。

interface Car {
  make: string
  model: string
}

type SomeType = Partial<Car>

const car: SomeType = {}

if (car === "typescript doesn't complain about this") {
    // This code will never execute..?
}

我錯過了什么嗎? car永遠不會等於字符串,對吧? 通常,當您嘗試比較沒有重疊的兩種不同類型時,Typescript 會對您大喊大叫並告訴您它總是會返回 false。 對此的任何幫助將不勝感激!

Partial<Car>是一個弱類型,因為它的所有屬性都是可選的。 TypeScript 2.4 添加了一個檢查,如果您嘗試將類似string的內容分配給弱類型,則會警告您,因為沒有重疊的屬性:

let car: { make?: string, model?: string };
car = {}; // okay
car = "oops"; // error! Type '"oops"' has no properties in common with type 
// '{ make?: string | undefined; model?: string | undefined; }'.

但是在 TypeScript 2.4 之前, car = "oops"將被允許而沒有錯誤,因為"oops"的明顯成員(如lengthtoUpperCase )都不會與Partial<Car>沖突。 從結構上講, stringPartial<Car> 但是分配可能是一個錯誤,弱類型檢測會警告您。


不過,這種弱類型檢測似乎只適用於可分配性。 正如您所注意到的,它不適用於比較運算符:

if (car === "oops") {  } // no error

microsoft/TypeScript#32627有一個開放的功能請求,要求對此進行更改。 如果您對此足夠關心以看到它發生了變化,您可能會 go 解決這個問題,給它一個,也許給出一個令人信服的案例來說明為什么這對您很重要。 但我懷疑它會產生多大的影響,並且沒有跡象表明這會實施,因為沒有社區參與。 大概人們在現實世界的代碼中不會經常遇到這種情況。


因此,您所問問題的答案是:從未為比較運算符實現弱類型檢測,而且似乎沒有太多需要改變這一點。

Playground 代碼鏈接

Partial<T>將始終允許類型{} (當沒有提供鍵時)。

{}有一些……怪癖。

幾乎就像使用any 幾乎 JavaScript 中的每個值都可以分配給類型{} 因為想想。 它不需要值具有任何鍵。 任何東西至少都有一些鍵,所以通過結構類型,任何東西都符合這種類型。

看看你是否遺漏了SomeType ,結果是一樣的:

const car = {}; // now inferred as '{}'

if (car === "typescript doesn't complain about this") {

}

TypeScript 沒有抱怨它,因為在它看來,條件可能會運行(類型重疊,字符串可分配給{} )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM