interface SquareConfig {
color?: string;
width?: number;
}
function createSquare(config: SquareConfig): { color: string; area: number } {
// ...
}
let mySquare = createSquare({ colour: "red", width: 100 });
ts Beim Kompilieren dieses Codes wird ein Fehler ausgegeben, bei Verwendung der folgenden beiden Methoden wird dieser jedoch nicht ausgel?st. Die Erkl?rung auf der offiziellen Website übersteigt mein Verst?ndnis. Ich habe nur das Gefühl, dass die Syntax so beil?ufig ist ...
let mySquare = createSquare({ width: 100, opacity: 0.5 } as SquareConfig);
oder
let squareOptions = { colour: "red", width: 100 };
let mySquare = createSquare(squareOptions);
Auf diese Weise wird kein Fehler gemeldet, wenn Assertionen (as/<>) verwendet werden. Nach welchen Regeln wird die Schnittstelle verglichen? Kopieren Sie dann das Objektliteral in die Variable. Ich wei?, dass dies ein Referenzzeiger auf das Objekt ist, aber warum werden die zus?tzlichen Eigenschaften nicht erkannt? Offizielle Website-Adresse
第一個例子:as
不是斷言吧 as
是強制轉(zhuǎn)化 就說明你知道你要做的事情 當然 ts 也就讓你編譯過了
第二個例子 好像本來就應(yīng)該過的吧 color
你又不是一定要; colour
是另外一個屬性了
以前不過的原因是 ts 對 對象字面量有獨特的 check 罷了
as 是強制類型轉(zhuǎn)換,強制把一個變量當作另一種類型使用,運行時出問題你自己負責。
使用對象字面量賦值對象的檢測邏輯和使用變量賦值對象的機制不一樣。
interface SquareConfig {
color?: string;
width?: number;
}
function test(config: SquareConfig): void {}
let a = { colour: "red", width: 100 };
// 不報錯, typeof a 與 SquareConfig 類型兼容
let b: SquareConfig = a;
// 報錯,聲明 c 是 SquareConfig 類型但是給了不存在的屬性
let c: SquareConfig = { colour: "red", width: 100 };
// 報錯,原因和上面類似
test({ colour: "red", width: 100 })
// 不報錯,強制把這個對象字面量當 SquareConfig 類型使用,出問題你自己背鍋
let d: SquareConfig = <SquareConfig> { colour: "red", width: 100 };