Typescript 如何将函数声明为带有强制参数的类型

Typescript 如何将函数声明为带有强制参数的类型,typescript,Typescript,我声明了一个类型,它是一个函数,它接受一个Person类型的参数并返回一个Person 我没有指定参数是可选的,那么为什么typescript允许我向他传递一个没有参数的函数呢 type Patcher = (key: Person) => Person; function doSomething<T>(patcher: Patcher){ console.log('hello world'); } doSomething<Person>(() =>

我声明了一个类型,它是一个函数,它接受一个Person类型的参数并返回一个Person

我没有指定参数是可选的,那么为什么typescript允许我向他传递一个没有参数的函数呢

type Patcher = (key: Person) => Person;

function doSomething<T>(patcher: Patcher){
   console.log('hello world');
}

doSomething<Person>(() => { // Here I pass empty parameter but typescript doesn't complain
    console.log('Hello world 2');
    return {
        firstName: 'john',
        age: 10
    }
})


interface Person{
    firstName: string;
    age: number;
}
type Patcher=(键:Person)=>Person;
功能剂量仪(修补程序:修补程序){
log('helloworld');
}
doSomething(()=>{//这里我传递空参数,但typescript没有抱怨
log('helloworld2');
返回{
名字:“约翰”,
年龄:10
}
})
接口人{
名字:字符串;
年龄:人数;
}

我使用的是上一个typescript版本

typescript没有理由对你大喊大叫

如果添加一个未使用的参数,会有什么不同吗

doSomething<Person>((personThatWouldNotBeUsed) => {
    console.log('Hello world 2');
    return {
        firstName: 'john',
        age: 10
    }
})
doSomething((不使用个人)=>{
log('helloworld2');
返回{
名字:“约翰”,
年龄:10
}
})
您所说的“我希望函数将
Person
作为参数,并返回
Person
作为结果”仅仅意味着您将使用
Person
对象调用任何函数,并且您将把返回的结果视为
Person
对象。函数是否实际使用提供的参数完全取决于它



TL;DR-您不能强制消费者通过的回调使用所有参数,也不应该能够。由使用者决定是否要使用提供的参数。

TypeScript不会有充分的理由对您大喊大叫

如果添加一个未使用的参数,会有什么不同吗

doSomething<Person>((personThatWouldNotBeUsed) => {
    console.log('Hello world 2');
    return {
        firstName: 'john',
        age: 10
    }
})
doSomething((不使用个人)=>{
log('helloworld2');
返回{
名字:“约翰”,
年龄:10
}
})
您所说的“我希望函数将
Person
作为参数,并返回
Person
作为结果”仅仅意味着您将使用
Person
对象调用任何函数,并且您将把返回的结果视为
Person
对象。函数是否实际使用提供的参数完全取决于它



TL;DR-您不能强制消费者通过的回调使用所有参数,也不应该能够。由使用者决定是否使用提供的参数。

常见问题解答中有此方法:。但不要在常见问题解答中这样做:。但不要太在意。。你可以用条件类型来编造一个复杂的解决方案(我100%确定我在某处有一个,但现在找不到),但是你是对的,这不值得,TS有这个权利,我想不出一个好的理由来强制它。嗯。。你可以用条件类型来编造一个复杂的解决方案(我100%确定我在某处有一个,但现在找不到),但是你是对的,这不值得,TS有这个权利,我想不出一个好的理由来强制这样做。