考虑这个定义:
.localeCompare()
IDE能够为您提供正确的检查(如图所示):
这是因为 typescript 能够将 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>;
推断为 'foo'
的文字类型。
如果我为通用extends N /* string */
提供签名,则typescript会丢失有关M
的信息并返回通用'foo'
。
如何更改上述定义以保留有关string
的信息?
答案 0 :(得分:1)
我看到了这些选项:
提供第二种类型
let domain = createDomain<Todo, "foo">("foo");
建立工厂
function funcCreateDomain<M>() {
return <N extends string>(name: N) => createDomain<M, N>(name);
}
let factory = funcCreateDomain<Todo>();
let domain = factory("foo");