Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >TypeScript:当启用严格的函数类型时,输入一个接受新对象的函数

TypeScript:当启用严格的函数类型时,输入一个接受新对象的函数
EN

Stack Overflow用户
提问于 2019-10-28 16:53:28
回答 1查看 104关注 0票数 1

使用启用严格函数类型的TypeScript,我试图表示一个函数create,它接受一个本身带有IService参数的新对象:

代码语言:javascript
运行
AI代码解释
复制
interface IService { }

interface Constructible<T> {
    new(service: IService): T;
}

declare function create<T>(ctor: Constructible<T>): void;

然后,我想使用一个在构造函数中使用更特定版本的createManager类来调用IService

代码语言:javascript
运行
AI代码解释
复制
interface RequestService extends IService {
    makeRequest(): void;
}

class Manager {
    constructor(requestService: RequestService) { }
}

create<Manager>(Manager);

这在启用严格的函数类型时确实有效。调用create的错误是:

代码语言:javascript
运行
AI代码解释
复制
Argument of type 'typeof Manager' is not assignable to parameter of type 'Constructible<Manager>'.
  Types of parameters 'requestService' and 'service' are incompatible.
    Property 'makeRequest' is missing in type 'IService' but required in type 'RequestService'.

为什么会发生此错误,并且我可以在不使用强制转换和不内联类型的情况下表示此模式?

我知道唯一可行的解决方法是内联Constructible并使用extends

代码语言:javascript
运行
AI代码解释
复制
declare function create<T, S extends IService>(ctor: { new(service: S): T; }): void;

不幸的是,如果我对提取的接口进行同样的尝试,它将无法工作:

代码语言:javascript
运行
AI代码解释
复制
interface Constructible<T> {
    new<S extends IService>(service: S): T;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-28 22:41:24

我认为你的解决办法基本上是可行的。有了提供的信息(正如jcalz提到的那样,更多的信息可能会产生来自我们的更好的建议),我建议将S放在Constructible类型上,而不是构造函数签名。从我在这个例子中可以看到,实现类本身并不是泛型的(即。它不能接受调用者想要的任何S,它需要一个由类声明确定的特定S )

代码语言:javascript
运行
AI代码解释
复制
interface IService { }

interface Constructible<T, S extends IService> {
    new(service: S): T;
}

declare function create<T, S extends IService>(ctor: Constructible<T, S>, service: S): void;

interface RequestService extends IService {
    makeRequest(): void;
}

class Manager {
    constructor(requestService: RequestService) { }
}

create(Manager, {
  makeRequest() { }
});

我还向create函数添加了一个服务类型的参数。不确定如何确保服务参数在实际代码中正确,但这似乎是调用方需要知道的东西,而不是实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58600169

复制
相关文章
TypeScript函数的类型
函数声明 在 JavaScript 中,有两种常见的定义函数的方式——函数声明(Function Declaration)和函数表达式(Function Expression): 函数声明(Function Declaration)
conanma
2021/12/07
2.1K0
TypeScript函数类型
通过如下代码我们实现了一个返回值为number类型的方法,同时我们也对返回值和参数进行了约束
HueiFeng
2020/04/09
7940
TypeScript函数类型
通过如下代码我们实现了一个返回值为number类型的方法,同时我们也对返回值和参数进行了约束
HueiFeng
2020/04/10
8240
TypeScript获取函数参数类型
现在有一个函数update,我们想要获取他的参数类型,你应该怎么做呢?这个时候我们需要就要用到Parameters
用户6256742
2022/07/06
3K0
TypeScript - 类型声明、枚举、函数、接口
4.自定义类型 当一些复杂类型需要多次使用,可以通过type来自定义类型,便于复用
WahFung
2020/08/22
1.8K0
TypeScript 对象的类型-接口
在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型
Leophen
2020/07/13
3.5K0
获取对象具体类型的功能函数
HTML5学堂:JavaScript当中,时常会使用到typeof来进行数据类型的检测,但是我们觉得typeof不能够满足我们的需求,对于数组、函数、时间对象等,使用typeof返回的都是“object”,如果我们希望更进一步的检测要怎么办呢?一起来看吧~ toString方法 在JavaScript当中,想要判断一个对象值属于哪种内置对象,最靠谱的方法就是使用toString 先上代码 var str = 'HTML5学堂'; var arr = ['独行冰海', '梦幻雪冰']; var obj = {
HTML5学堂
2018/03/12
1.4K0
获取对象具体类型的功能函数
Golang 函数返回类型是接口时返回对象的指针还是值
Interface 是一组抽象方法(未具体实现的方法,仅包含方法名参数返回值的方法)的集合,如果实现了 interface 中的所有方法,即该类型就实现了该接口。
恋喵大鲤鱼
2019/06/14
8.3K0
(十六)函数作为参数值、变量值或对象时的类型
# 一、函数作为参数值、变量值或对象时的类型 说明 函数作为参数值、变量值或对象时它的类型该如何限定 问题 // 这个时候限定传入的参数要符合这种类型参数呢 function request(callback) { callback('sucess') } 解决方式 语法:callback: (名字: 类型) => 返回值类型,没有返回值用 void function request(callback: (result: string) => void) { callback('sucess
老怪兽
2023/02/22
1.4K0
初探 TypeScript函数基本类型泛型接口类内置对象
前段时间有朋友和我推荐 TypeScript ,他说写起来特别爽,让我去试一试,那时候我还在那是啥高深莫测的东西。刚好那段时间忙,一直没有时间看。最近也很忙,还是抽时间来探一探 TypeScript ;简单说 ts 主要提供的是 dynamic type check,提供的 interface 接口这个功能在开发项目的时候会很有帮助。TypeScript是 JavaScript 的一个超集。他和 JavaScript 有着千丝万缕的关系。
sunseekers
2018/10/31
7.4K0
typescript中的工厂函数
工厂函数是一种特殊的函数,用于创建和返回对象或其他数据结构。它通常用于封装和组织代码,允许动态地创建多个实例或对象,每个实例可能具有不同的属性或行为。
酒楼
2023/10/09
2900
TypeScript 函数中的 this 参数
从 TypeScript 2.0 开始,在函数和方法中我们可以声明 this 的类型,实际使用起来也很简单,比如:
阿宝哥
2020/03/20
8K0
python 可接受任意参数的函数
def avg(first, *rest): return (first + sum(rest)) / (1 + len(rest))
用户5760343
2019/10/21
8420
Typescript 严格模式有多严格?
"use strict"指令在JavaScript 1.8.5 (ECMAScript5)中新增。
用户1462769
2019/11/18
3.1K0
Typescript 严格模式有多严格?
Typescript 严格模式有多严格?
"use strict"指令在JavaScript 1.8.5 (ECMAScript5)中新增。
前端劝退师
2019/11/07
2.1K0
Typescript 严格模式有多严格?
mybatis文件映射之当输入的参数不只一个时
2、多个参数:mybatis遇见多个参数会进行特殊处理,多个参数会被封装成员一个map,#{}就是从Map中获取指定的key的值。
西西嘛呦
2020/08/26
4930
【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )
函数类型格式 : 圆括号中定义 参数类型列表 , 使用 -> 由参数列表指向返回值类型 , 表示接受 参数类型列表 中的参数 , 返回 返回值类型 的返回值 ;
韩曙亮
2023/03/27
3K0
TypeScript 函数(下)
递归函数 递归函数即在函数内调用函数本身。 举个例子: 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?'从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……'" 实例 function factorial(number) { if (number <= 0) { // 停止执行 return 1; } else {
陈不成i
2021/07/30
6050
点击加载更多

相似问题

严格定义接受对象的函数的类型,修改它的值,并在TypeScript中返回它

26

TypeScript如何对子构造函数使用更严格的类型?

24

TypeScript推断接受函数作为参数函数返回类型

114

接受对象或数组参数的TypeScript函数

112

调用/应用严格函数与非严格函数时不同类型的“this”

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档