rest参数的类型检验

来源:2-12 泛型(Generics) 第三部分 - 类和接口

慕粉1845456658

2020-05-02

老师,您好,有一个问题想请教您一下。

代码如下:


class Person {

    name: string

    age: number

    constructor(name: string, age: number) {

        this.name = name

        this.age = age

    }

}

function createInstance<T>(ctor: new (...params) => T, ...args): T {

    return new ctor(...args)

}

const person = createInstance<Person>(Person, 123, 20) // should be error: 类型“123”的参数不能赋给类型“string”的参数

console.log(person.name) // 123

console.log(person.name.length) // undefined


我的问题是:

1、Person的constructor方法中,name参数应该是字符型;但在createInstance<Person>(Person, 123, 20) 中传入的123是number类型,但是typescript没有提示类型错误,导致person.name.length为undefined。

2、如何给rest参数...params进行类型校验?


写回答

1回答

张轩

2020-05-03

同学你好,ts 没办法,进入函数体内,进行参数校验,你可以在 createInstance 的 ...args 进行校验,语法和其他一样 ...args: string[]

虽然 person.name 其实是个数字,但是 Person类上 的name 属性定义是个string 类型,所以ts 没有办法校验出来这个错误。你返回的是 Person 的实例,它自然以为 name 是字符串

0
4
慕粉1845456658
回复
张轩
谢谢老师。我最后查到了资料,使用了ts的工具类,这样可以很灵活的使用泛型来进行约束了。 class Person { name: string age: number constructor(name: string, age: number) { this.name = name this.age = age } } type TPerson = ConstructorParameters function createInstance(ctor: new (...params) => T, ...args: U) { return new ctor(...args) } const person = createInstance(Person, 'person', 20) 使用了ConstructorParameters,也不用在代码里写死元祖[string,number]了。
2020-05-12
共4条回复

React18+TS高仿AntD从零到一打造组件库

设计,开发,测试,发布再到 CI/CD,从0到1造轮子

2123 学习 · 959 问题

查看课程