How to specify a type based on the object returned by a function
up vote
1
down vote
favorite
If I create an object using a constructor function
function Person(name: string) this.name = name;
how would I specify the type returned by the constructor function?
function hello(person: ???): string
return 'hello ' + person.name;
const person = new Person('John');
hello(person);
flowtype
|
show 4 more comments
up vote
1
down vote
favorite
If I create an object using a constructor function
function Person(name: string) this.name = name;
how would I specify the type returned by the constructor function?
function hello(person: ???): string
return 'hello ' + person.name;
const person = new Person('John');
hello(person);
flowtype
name: string
? See the docs.
– jonrsharpe
Nov 11 at 15:02
Thenew
keyword will always return the new Object instance. It won't return the string like you are expecting.
– Ross Allen
Nov 11 at 15:04
@jonrsharpe This would imply that all object with the same properties are the same. I would imagine, that two objects with different constructor function must also be different for flow.
– doberkofler
Nov 11 at 15:06
No, it implies that all objects with the same properties have the same properties. The code consuming it just cares whether or not it has a.name
it can add to'hello '
.
– jonrsharpe
Nov 11 at 15:08
1
Good question. As a workaround you can convertPerson
to class, and then easily usePerson
as a type.
– Alex
Nov 12 at 9:10
|
show 4 more comments
up vote
1
down vote
favorite
up vote
1
down vote
favorite
If I create an object using a constructor function
function Person(name: string) this.name = name;
how would I specify the type returned by the constructor function?
function hello(person: ???): string
return 'hello ' + person.name;
const person = new Person('John');
hello(person);
flowtype
If I create an object using a constructor function
function Person(name: string) this.name = name;
how would I specify the type returned by the constructor function?
function hello(person: ???): string
return 'hello ' + person.name;
const person = new Person('John');
hello(person);
flowtype
flowtype
asked Nov 11 at 14:59
doberkofler
2,04743157
2,04743157
name: string
? See the docs.
– jonrsharpe
Nov 11 at 15:02
Thenew
keyword will always return the new Object instance. It won't return the string like you are expecting.
– Ross Allen
Nov 11 at 15:04
@jonrsharpe This would imply that all object with the same properties are the same. I would imagine, that two objects with different constructor function must also be different for flow.
– doberkofler
Nov 11 at 15:06
No, it implies that all objects with the same properties have the same properties. The code consuming it just cares whether or not it has a.name
it can add to'hello '
.
– jonrsharpe
Nov 11 at 15:08
1
Good question. As a workaround you can convertPerson
to class, and then easily usePerson
as a type.
– Alex
Nov 12 at 9:10
|
show 4 more comments
name: string
? See the docs.
– jonrsharpe
Nov 11 at 15:02
Thenew
keyword will always return the new Object instance. It won't return the string like you are expecting.
– Ross Allen
Nov 11 at 15:04
@jonrsharpe This would imply that all object with the same properties are the same. I would imagine, that two objects with different constructor function must also be different for flow.
– doberkofler
Nov 11 at 15:06
No, it implies that all objects with the same properties have the same properties. The code consuming it just cares whether or not it has a.name
it can add to'hello '
.
– jonrsharpe
Nov 11 at 15:08
1
Good question. As a workaround you can convertPerson
to class, and then easily usePerson
as a type.
– Alex
Nov 12 at 9:10
name: string
? See the docs.– jonrsharpe
Nov 11 at 15:02
name: string
? See the docs.– jonrsharpe
Nov 11 at 15:02
The
new
keyword will always return the new Object instance. It won't return the string like you are expecting.– Ross Allen
Nov 11 at 15:04
The
new
keyword will always return the new Object instance. It won't return the string like you are expecting.– Ross Allen
Nov 11 at 15:04
@jonrsharpe This would imply that all object with the same properties are the same. I would imagine, that two objects with different constructor function must also be different for flow.
– doberkofler
Nov 11 at 15:06
@jonrsharpe This would imply that all object with the same properties are the same. I would imagine, that two objects with different constructor function must also be different for flow.
– doberkofler
Nov 11 at 15:06
No, it implies that all objects with the same properties have the same properties. The code consuming it just cares whether or not it has a
.name
it can add to 'hello '
.– jonrsharpe
Nov 11 at 15:08
No, it implies that all objects with the same properties have the same properties. The code consuming it just cares whether or not it has a
.name
it can add to 'hello '
.– jonrsharpe
Nov 11 at 15:08
1
1
Good question. As a workaround you can convert
Person
to class, and then easily use Person
as a type.– Alex
Nov 12 at 9:10
Good question. As a workaround you can convert
Person
to class, and then easily use Person
as a type.– Alex
Nov 12 at 9:10
|
show 4 more comments
1 Answer
1
active
oldest
votes
up vote
0
down vote
You just have to describe your constructor function in an interface as you would do with a normal class implementation and use it within your hello
function:
/* @flow */
interface IPerson
name: string;
function Person(name: string)
this.name = name;
function hello(person: IPerson): string
return 'hello ' + person.name;
const person = new Person('John');
hello(person);
However I would recommend against using constructor functions instead of regular classes because the point of interfaces in Flow are to be implemented by classes in order to type-guard them:
class Person implements IPerson
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
You just have to describe your constructor function in an interface as you would do with a normal class implementation and use it within your hello
function:
/* @flow */
interface IPerson
name: string;
function Person(name: string)
this.name = name;
function hello(person: IPerson): string
return 'hello ' + person.name;
const person = new Person('John');
hello(person);
However I would recommend against using constructor functions instead of regular classes because the point of interfaces in Flow are to be implemented by classes in order to type-guard them:
class Person implements IPerson
add a comment |
up vote
0
down vote
You just have to describe your constructor function in an interface as you would do with a normal class implementation and use it within your hello
function:
/* @flow */
interface IPerson
name: string;
function Person(name: string)
this.name = name;
function hello(person: IPerson): string
return 'hello ' + person.name;
const person = new Person('John');
hello(person);
However I would recommend against using constructor functions instead of regular classes because the point of interfaces in Flow are to be implemented by classes in order to type-guard them:
class Person implements IPerson
add a comment |
up vote
0
down vote
up vote
0
down vote
You just have to describe your constructor function in an interface as you would do with a normal class implementation and use it within your hello
function:
/* @flow */
interface IPerson
name: string;
function Person(name: string)
this.name = name;
function hello(person: IPerson): string
return 'hello ' + person.name;
const person = new Person('John');
hello(person);
However I would recommend against using constructor functions instead of regular classes because the point of interfaces in Flow are to be implemented by classes in order to type-guard them:
class Person implements IPerson
You just have to describe your constructor function in an interface as you would do with a normal class implementation and use it within your hello
function:
/* @flow */
interface IPerson
name: string;
function Person(name: string)
this.name = name;
function hello(person: IPerson): string
return 'hello ' + person.name;
const person = new Person('John');
hello(person);
However I would recommend against using constructor functions instead of regular classes because the point of interfaces in Flow are to be implemented by classes in order to type-guard them:
class Person implements IPerson
answered Nov 19 at 3:26
Ivan Gabriele
3,28622444
3,28622444
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53249970%2fhow-to-specify-a-type-based-on-the-object-returned-by-a-function%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
name: string
? See the docs.– jonrsharpe
Nov 11 at 15:02
The
new
keyword will always return the new Object instance. It won't return the string like you are expecting.– Ross Allen
Nov 11 at 15:04
@jonrsharpe This would imply that all object with the same properties are the same. I would imagine, that two objects with different constructor function must also be different for flow.
– doberkofler
Nov 11 at 15:06
No, it implies that all objects with the same properties have the same properties. The code consuming it just cares whether or not it has a
.name
it can add to'hello '
.– jonrsharpe
Nov 11 at 15:08
1
Good question. As a workaround you can convert
Person
to class, and then easily usePerson
as a type.– Alex
Nov 12 at 9:10