是否可以有一个函数接受类实例,但不接受普通对象?

JC *_*ord 3 typescript

我想编写一个将类实例作为参数的函数,但不允许使用普通的匿名类型的对象。

例如:

class Dog {
    constructor(name: string, breed: "husky" | "boxer") {
        this.name = name;
        this.breed = breed;
    }
    name: string;
    breed: "husky" | "boxer";
}

class Cat {
    constructor(name: string, breed: "siamese" | "persian") {
        this.name = name;
        this.breed = breed;
    }
    name: string;
    breed: "siamese" | "persian";
}

function pat(pet: NoPlainObjects) {
    document.write(pet.constructor.name);
}

pat(new Dog('Fido', 'boxer')); //works
pat(new Cat('Spot', 'persian')); //works

pat({name: 'snuffaluffagus'}); //compile error
Run Code Online (Sandbox Code Playgroud)

Sha*_*tin 5

是否可以有一个函数接受类实例,但不接受普通对象?

目前还不可能,因为TypeScript使用结构子类型。这意味着用类构造函数创建的对象在具有兼容属性的情况下与普通的旧JavaScript对象文字兼容。

这是文档关于类型兼容性的说法:

TypeScript的结构类型系统的基本规则是,如果y与x至少具有相同的成员,则x与y兼容。为了检查是否可以将y赋给x,编译器将检查x的每个属性,以在y中找到对应的兼容属性。在检查函数调用参数时,使用相同的分配规则。[强调]

您的问题提出了一个问题:为什么要让函数接受类实例并拒绝普通的旧JavaScript对象?