Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript函数定义,以确保第二个参数的类型与第一个参数的类型相同_Typescript - Fatal编程技术网

Typescript函数定义,以确保第二个参数的类型与第一个参数的类型相同

Typescript函数定义,以确保第二个参数的类型与第一个参数的类型相同,typescript,Typescript,假设我有这个函数(忽略它的用途,这只是一个基本示例): 如果object2需要与object的类型相同,如何编写类型定义 比如说, interface DefaultObject { foo: number, other?: string } const object1: DefaultObject = { foo: 1 } // ::::::::::::::::::::::::::::::::::: const object2 = { other: "something"

假设我有这个函数(忽略它的用途,这只是一个基本示例):

如果
object2
需要与
object
的类型相同,如何编写类型定义

比如说,

interface DefaultObject {
  foo: number,
  other?: string
}

const object1: DefaultObject = {
  foo: 1
}

// :::::::::::::::::::::::::::::::::::

const object2 = {
  other: "something"
}
doSomething(object1, object2)

// this should error as object2 does not contain the required 'foo' key/value pair

// :::::::::::::::::::::::::::::::::::

const object3 = {
  foo: "1"
}
doSomething(object1, object3)

// this should error as object3's 'foo' value is not a number 

// :::::::::::::::::::::::::::::::::::

const object4 = {
  foo: 2,
  bar: 2
}
doSomething(object1, object4)

// this should error as object2 contains an extra 'bar' key/value pair

// :::::::::::::::::::::::::::::::::::

const object5 = {
  foo: 2
}
doSomething(object1, object5)

// this should pass as both objects have the same DefaultObject type 

// :::::::::::::::::::::::::::::::::::

您可以向函数添加泛型类型参数,并将其用于
object1
object2

const doSomething = <T,>(object1: T, object2: T) => { // comma for tsx files
  return { ...object1, ...object2 }
}

不幸的是,这不起作用,因为它不是有效的语法,但是我能够将它更改为一个几乎可以工作的接口,但是它没有通过
object4
测试。下一个注释中的接口
接口DoSomething{(object1:T,object2:T):T;}
@GCM它在ts文件中是有效语法,您在tsx文件中吗?哦,是的,您是对的。你的编辑现在可以了。但是它仍然没有通过
object4
测试。@Qwerty您不能将没有泛型的函数分配给具有泛型的签名。泛型类型参数由调用方决定,而不是由eh实现决定。
const doSomething = <T,>(object1: T, object2: T) => { // comma for tsx files
  return { ...object1, ...object2 }
}
const doSomething = <T, U extends T>(object1: T, object2: U & (keyof U extends keyof T ? {} : "No etxra keys")) => { // comma for tsx files
  return { ...object1, ...object2 }
}