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
是强制转化 就说明你知道你要做的事情 当然 ts 也就让你编译过了第二个例子 好像本来就应该过的吧
color
你又不是一定要;colour
是另外一个属性了以前不过的原因是 ts 对 对象字面量有独特的 check 罢了
as 是强制类型转换,强制把一个变量当作另一种类型使用,运行时出问题你自己负责。
使用对象字面量赋值对象的检测逻辑和使用变量赋值对象的机制不一样。