Typescript tvingar funktionsargument att vara en instans av en klass
Vad ska jag göra för att deklarera en funktion som tar en klassinstans som argument
class Message{
constructor(readonly text:string){}
}
function publish(message:Message){
if(!message instanceof Message){
throw new Error("arg message is not instance of Message")
}
...
}
Jag skulle INTE förvänta mig att följande kod kompilerar
publish({text:"HELLO!"})
men det kompilerar och objektet som skickas till funktionen har definitivt samma egenskaper men det är inte en instans av Message. Jag skulle vilja tvinga argumentet att vara en instans av den klassen.
Svar #1
Typescript använder typ-signaturer för att avgöra om det kan kompilera. Din kod kommer att kompilera eftersom objektet {text: "HELLO"} matchar signaturen för Message-klassen.
Om du har något som anropar publish-funktionen efter kompilering, måste du fortfarande utföra if(message instanceof Message === false) och kasta ett fel.
Svar #2
du kan enkelt lägga till privat egendom i klassen, då om någon försöker skicka ett vanligt objekt kommer de att få felet TS2345
t.ex.
class Message {
private readonly _type = 'Message';
constructor(readonly text:string){}
}
Jag föredrar att göra den privata egenskapen _type, men du kan namnge den något som private _enforce_instance=''
