【发布时间】:2016-10-25 20:42:01
【问题描述】:
这就是我想要实现的目标:
interface IFoo { ... }
function extendWithFoo<T extends {}>(x: T = {}): T & IFoo {
...
}
我收到错误 TS2322:类型“{}”不可分配给类型“T”。
有没有办法做到这一点?
【问题讨论】:
标签: typescript
这就是我想要实现的目标:
interface IFoo { ... }
function extendWithFoo<T extends {}>(x: T = {}): T & IFoo {
...
}
我收到错误 TS2322:类型“{}”不可分配给类型“T”。
有没有办法做到这一点?
【问题讨论】:
标签: typescript
你可以这样做:
function extendWithFoo<T extends {}>(x: T = {} as T): T & IFoo {
...
}
但是使用空对象是有问题的,因为它接受所有内容:
extendWithFoo(3); // ok
extendWithFoo("string"); // ok
extendWithFoo(true); // ok
extendWithFoo({}); // ok
extendWithFoo({ key: "value" }); // ok
extendWithFoo(new Array()); // ok
所以我的建议是使用更具体的东西。
无论如何,您并不需要它,您可以:
function extendWithFoo<T>(x: T = {} as T): T & IFoo {
...
}
这给了你同样的东西。
【讨论】:
除了 Nitzan Tomer 的建议之外,您还可以引入一种类型以将输入限制为仅限对象字面量
type ObjectLiteral = { [key: string]: any };
interface IFoo {
resultHasFoo(): void;
}
function extendWithFoo<T extends ObjectLiteral>(x: T = {} as T): T & IFoo {
return x as T & IFoo;
}
extendWithFoo(false); // error!
extendWithFoo(123); // error!
var p = extendWithFoo({
test: "one"
});
p.resultHasFoo(); // works!
看看我的相关帖子...JavaScript to TypeScript: Intellisense and dynamic members
【讨论】: