首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >定义输入类型时输出未定义的类型

定义输入类型时输出未定义的类型
EN

Stack Overflow用户
提问于 2020-08-21 23:28:15
回答 1查看 130关注 0票数 0

我刚写了这个函数:

代码语言:javascript
代码运行次数:0
运行
复制
const cloneUrl = <T extends (URL | undefined)>(url: T): T => url instanceof URL
  ? new URL(url.toString())
  : undefined;

但是,这有错误(或者至少是非常接近此的错误):

“未定义的'URL”不能分配到键入“T”。可以用任意类型实例化'T‘,该类型可能与'URL \ undefined’无关。 “未定义”类型不能指定为“T”。“未定义”可分配到“T”类型的约束,但“T”可以用另一种约束子类型“URL未定义”实例化。

很明显,我并没有掌握TypeScript的一些基本知识.

我的目标是这样,当用已知为URL的类型调用cloneUrl时,返回类型是URL,但是当用URL | undefined类型调用cloneUrl时,返回类型是URL | undefined

示例:

代码语言:javascript
代码运行次数:0
运行
复制
class UrlWrapper {
  private readonly _urlOne: URL
  private readonly _urlTwo?: URL

  constructor(urlOne: URL, urlTwo?: URL) {
    this._urlOne = urlOne;
    this._urlTwo = urlTwo;
  }

  get urlOne(): URL { return cloneUrl(this._urlOne); }
  get urlTwo(): URL | undefined { return cloneUrl(this._urlTwo); }
}

看到urlWrapper.urlOne如何总是一个不可定义的值,但是urlTwo可以吗?

我尝试过不同类型的约束:

  • <T extends URL>
  • <T extends URL ? URL : undefined>

我尝试过不同的参数:

  • url?: T
  • url: T | undefined

我试着预测结果:

  • undefined as undefined
  • undefined as T | undefined

我尝试过将私有字段设置为可选字段,或者更改其类型。

我尝试使用类型检查函数:

  • const checkIsUrl = (url: unknown): url is URL => url instanceof URL;

...and更多。

但是关于TypeScript是如何看待那些我没有正确的心理模型的类型的,所以我就是没有得到它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-21 23:50:37

我最近处理了这个问题,发现下面的内容似乎可以使用泛型和条件返回类型一起使用。any使用的丑陋之处在于,但我不知道如何避免这种情况。这是巫毒,我不完全摸索,但类型是推断出你所期望的。

代码语言:javascript
代码运行次数:0
运行
复制
export function cloneUrl<T extends URL | undefined>(value: T): T extends URL ? URL : undefined {
    return value instanceof URL ? new URL(value.toString()) : (undefined as any);
}

let source: URL | undefined = new URL("test");
cloneUrl(source); // URL
source = undefined;
cloneUrl(source); // undefined
let optionalSource: URL | undefined;
cloneUrl(optionalSource); // URL or undefined
cloneUrl(new Date()); // Nope: Date isn't a URL
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63531189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档