说我有
class Person {
constructor(public name: string) {}
}
type Constructor<T> = new(...args: any[]) => T;
function Tagged<T extends Constructor<{}>>(Base: T) {
return class extends Base {
_tag: string;
constructor(...args: any[]) {
super(...args);
this._tag = "";
}
}
}
我想拥有一个将Tagged创建的类的实例作为参数的函数。例如:
function printTag(taggedObj: Tagged(Person)) {
console.log(taggedObj._tag);
}
如何正确键入此信息,这现在给我一个编译错误?我需要创建另一个课程吗?喜欢:
class TaggedPoint extends Tagged(Person) {}
接下来的问题是,如果我创建
function printTag(taggedObj: TaggedPoint) {
console.log(taggedObj._tag);
}
然后在其他地方
class OtherTaggedPoint extends Tagged(Person) {
constructor(tag) {
super(‘some string’);
}
}
printTag(new OtherTaggedPoint());
由于TaggedPoint
与OtherTaggedPoint
不同,这会导致编译错误吗?
答案 0 :(得分:1)
首先,我将为混入所提供的内容提供一个命名接口:
interface Tagged
{
_tag: string;
}
然后我只需将函数签名更改为:
function printTag(taggedObj: Tagged)
{
console.log(taggedObj._tag);
}
编译器将认识到Tagged(Person)
实现了该接口。
如果一个函数实际上需要一个Tagged(Person)
,我会使用一个交集:
function printTaggedPerson(taggedPerson: Tagged & Person)
{
console.log(taggedPerson.name); // Access to property of Person
console.log(taggedPerson._tag); // Access to property of Tagged
}
关于后续问题:TypeScript使用结构化类型,因此,如果类在结构上相同,则不会引发任何错误。