字面量类型推断 - TypeScript

4

考虑到这个定义:

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能够给你正确的检查(如图所示): enter image description here 这是因为typescript能够推断出'foo'作为字面类型,它extends N /* string */

但是

如果我为泛型M提供签名,那么typescript就会失去关于'foo'的信息,并返回一个泛型stringenter image description here

我应该如何修改上述定义以保留关于N的信息?

1个回答

2

I see these options:

Provide the second type

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");

不幸的是,更改 Surface API 不是一个选项,手动提供字面类型看起来很冗余。 - Hitmands

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接