考虑到这个定义:
interface Domain<Model, Name extends string> {
name: Name;
edit(cb: (m: Model) => Model): Domain<Model, Name>;
}
declare function createDomain<
M extends { [key: string]: any } = {},
N extends string = string
>(name: N): Domain<M, N>;
这个IDE能够给你正确的检查(如图所示):
这是因为typescript能够推断出'foo'
作为字面类型,它extends N /* string */
但是
如果我为泛型M
提供签名,那么typescript就会失去关于'foo'
的信息,并返回一个泛型string
。
我应该如何修改上述定义以保留关于N
的信息?