文字类型推断 - 打字稿

Posted

技术标签:

【中文标题】文字类型推断 - 打字稿【英文标题】:Literal Type inference - Typescript 【发布时间】:2018-06-09 02:36:06 【问题描述】:

考虑到这个定义:

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 的信息?

【问题讨论】:

【参考方案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");

【讨论】:

不幸的是,更改表面 api 不是一种选择,手动提供文字类型看起来是多余的。

以上是关于文字类型推断 - 打字稿的主要内容,如果未能解决你的问题,请参考以下文章