文字类型推断 - 打字稿

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 不是一种选择,手动提供文字类型看起来是多余的。

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

打字稿重载、可选参数和类型推断

打字稿:在对象内推断通用对象的类型

如何使用打字稿中的查找来推断类型化的 mapValues?

打字稿推断出不正确的类型:TS2339 属性“选定”在类型“字符串”上不存在

从字符串 => 类型的映射推断反应道具类型时修复打字稿警告

打字稿:在没有实际扩展/扩大的情况下捕获/推断类型的约束