[英]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"
的明顯成員(如length
和toUpperCase
)都不會與Partial<Car>
沖突。 從結構上講, string
是Partial<Car>
。 但是分配可能是一個錯誤,弱類型檢測會警告您。
不過,這種弱類型檢測似乎只適用於可分配性。 正如您所注意到的,它不適用於比較運算符:
if (car === "oops") { } // no error
在microsoft/TypeScript#32627有一個開放的功能請求,要求對此進行更改。 如果您對此足夠關心以看到它發生了變化,您可能會 go 解決這個問題,給它一個,也許給出一個令人信服的案例來說明為什么這對您很重要。 但我懷疑它會產生多大的影響,並且沒有跡象表明這會實施,因為沒有社區參與。 大概人們在現實世界的代碼中不會經常遇到這種情況。
因此,您所問問題的答案是:從未為比較運算符實現弱類型檢測,而且似乎沒有太多需要改變這一點。
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.